#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
#define MD (1000000007U)
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T1> void sortA_L( int N, T1 a[ ] , void * mem = wmem) {
sort( a, a+ N) ;
}
template < class T1, class T2> void sortA_L( int N, T1 a[ ] , T2 b[ ] , void * mem = wmem) {
int i;
pair< T1, T2> * arr;
walloc1d( & arr, N, & mem) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
arr[ i] .first = a[ i] ;
arr[ i] .second = b[ i] ;
}
sort( arr, arr+ N) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
a[ i] = arr[ i] .first ;
b[ i] = arr[ i] .second ;
}
}
template < class S, class T> inline S chmax( S & a, T b) {
if ( a< b) {
a= b;
}
return a;
}
template < class T> struct Heap{
int size;
T * val;
void malloc ( const int N) {
val = ( T* ) std:: malloc ( N* sizeof ( T) ) ;
size = 0 ;
}
void walloc( const int N, void ** mem = & wmem) {
walloc1d( & val, N, mem) ;
size = 0 ;
}
void free ( ) {
std:: free ( val) ;
}
void init( ) {
size = 0 ;
}
void up( ) {
int n = size - 1 ;
int m;
while ( n) {
m = ( n- 1 ) / 2 ;
if ( val[ m] <= val[ n] ) {
break ;
}
swap( val[ m] , val[ n] ) ;
n = m;
}
}
void down( ) {
int n = 0 ;
int m;
for ( ;; ) {
m= 2 * n+ 1 ;
if ( m>= size) {
break ;
}
if ( m+ 1 < size && val[ m] > val[ m+ 1 ] ) {
m++ ;
}
if ( val[ m] >= val[ n] ) {
break ;
}
swap( val[ m] , val[ n] ) ;
n = m;
}
}
T top( ) {
return val[ 0 ] ;
}
T pop( ) {
T res = val[ 0 ] ;
size-- ;
if ( size > 0 ) {
val[ 0 ] = val[ size] ;
down( ) ;
}
return res;
}
T push( const T x) {
val[ size++ ] = x;
up( ) ;
return x;
}
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
int s[ 100000 ] ;
int e[ 100000 ] ;
class Solution{
public :
int maxPerformance( int n, vector< int > & speed, vector< int > & efficiency, int k) {
int i;
dummy_main( ) ;
long long res = 0 ;
long long sm = 0 ;
Heap< int > hp;
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
s[ i] = speed[ i] ;
}
for ( i= ( 0 ) ; i< ( n) ; i++ ) {
e[ i] = efficiency[ i] ;
}
sortA_L( n,e,s) ;
hp.malloc ( k+ 1 ) ;
for ( i= ( n) - 1 ; i>= ( 0 ) ; i-- ) {
sm + = hp.push ( s[ i] ) ;
if ( hp.size > k) {
sm - = hp.pop ( ) ;
}
chmax( res, sm * e[ i] ) ;
}
hp.free ( ) ;
return res % MD;
}
}
;
// cLay varsion 20200325-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int s[1d5], e[1d5];
//
// class Solution {
// public:
// int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
// dummy_main();
//
// ll res = 0, sm = 0;
// Heap<int> hp;
// rep(i,n) s[i] = speed[i];
// rep(i,n) e[i] = efficiency[i];
// sortA(n,e,s);
// hp.malloc(k+1);
//
// rrep(i,n){
// sm += hp.push(s[i]);
// if(hp.size > k) sm -= hp.pop();
// res >?= sm * e[i];
// }
//
// hp.free();
// return res % MD;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTUQgKDEwMDAwMDAwMDdVKQp2b2lkICp3bWVtOwpjaGFyIG1lbWFycls5NjAwMDAwMF07CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4LCB2b2lkICoqbWVtID0gJndtZW0pewogIHN0YXRpYyBpbnQgc2tpcFsxNl0gPSB7MCwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMX07CiAgKCptZW0pID0gKHZvaWQqKSggKChjaGFyKikoKm1lbSkpICsgc2tpcFsoKHVuc2lnbmVkIGxvbmcgbG9uZykoKm1lbSkpICYgMTVdICk7CiAgKCphcnIpPShUKikoKm1lbSk7CiAgKCptZW0pPSgoKmFycikreCk7Cn0KdGVtcGxhdGU8Y2xhc3MgVDE+IHZvaWQgc29ydEFfTChpbnQgTiwgVDEgYVtdLCB2b2lkICptZW0gPSB3bWVtKXsKICBzb3J0KGEsIGErTik7Cn0KdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiB2b2lkIHNvcnRBX0woaW50IE4sIFQxIGFbXSwgVDIgYltdLCB2b2lkICptZW0gPSB3bWVtKXsKICBpbnQgaTsKICBwYWlyPFQxLCBUMj4gKmFycjsKICB3YWxsb2MxZCgmYXJyLCBOLCAmbWVtKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFycltpXS5maXJzdCA9IGFbaV07CiAgICBhcnJbaV0uc2Vjb25kID0gYltpXTsKICB9CiAgc29ydChhcnIsIGFycitOKTsKICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgIGFbaV0gPSBhcnJbaV0uZmlyc3Q7CiAgICBiW2ldID0gYXJyW2ldLnNlY29uZDsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgY2htYXgoUyAmYSwgVCBiKXsKICBpZihhPGIpewogICAgYT1iOwogIH0KICByZXR1cm4gYTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgSGVhcHsKICBpbnQgc2l6ZTsKICBUICp2YWw7CiAgdm9pZCBtYWxsb2MoY29uc3QgaW50IE4pewogICAgdmFsID0gKFQqKSBzdGQ6Om1hbGxvYyhOKnNpemVvZihUKSk7CiAgICBzaXplID0gMDsKICB9CiAgdm9pZCB3YWxsb2MoY29uc3QgaW50IE4sIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgICB3YWxsb2MxZCgmdmFsLCBOLCBtZW0pOwogICAgc2l6ZSA9IDA7CiAgfQogIHZvaWQgZnJlZSgpewogICAgc3RkOjpmcmVlKHZhbCk7CiAgfQogIHZvaWQgaW5pdCgpewogICAgc2l6ZSA9IDA7CiAgfQogIHZvaWQgdXAoKXsKICAgIGludCBuID0gc2l6ZSAtIDE7CiAgICBpbnQgbTsKICAgIHdoaWxlKG4pewogICAgICBtID0gKG4tMSkgLyAyOwogICAgICBpZih2YWxbbV0gPD0gdmFsW25dKXsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBzd2FwKHZhbFttXSwgdmFsW25dKTsKICAgICAgbiA9IG07CiAgICB9CiAgfQogIHZvaWQgZG93bigpewogICAgaW50IG4gPSAwOwogICAgaW50IG07CiAgICBmb3IoOzspewogICAgICBtPTIqbisxOwogICAgICBpZihtPj1zaXplKXsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZihtKzE8c2l6ZSAmJiB2YWxbbV0gPiB2YWxbbSsxXSl7CiAgICAgICAgbSsrOwogICAgICB9CiAgICAgIGlmKHZhbFttXSA+PSB2YWxbbl0pewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHN3YXAodmFsW21dLCB2YWxbbl0pOwogICAgICBuID0gbTsKICAgIH0KICB9CiAgVCB0b3AoKXsKICAgIHJldHVybiB2YWxbMF07CiAgfQogIFQgcG9wKCl7CiAgICBUIHJlcyA9IHZhbFswXTsKICAgIHNpemUtLTsKICAgIGlmKHNpemUgPiAwKXsKICAgICAgdmFsWzBdID0gdmFsW3NpemVdOwogICAgICBkb3duKCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0KICBUIHB1c2goY29uc3QgVCB4KXsKICAgIHZhbFtzaXplKytdID0geDsKICAgIHVwKCk7CiAgICByZXR1cm4geDsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KaW50IHNbMTAwMDAwXTsKaW50IGVbMTAwMDAwXTsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBtYXhQZXJmb3JtYW5jZShpbnQgbiwgdmVjdG9yPGludD4mIHNwZWVkLCB2ZWN0b3I8aW50PiYgZWZmaWNpZW5jeSwgaW50IGspewogICAgaW50IGk7CiAgICBkdW1teV9tYWluKCk7CiAgICBsb25nIGxvbmcgcmVzID0gMDsKICAgIGxvbmcgbG9uZyBzbSA9IDA7CiAgICBIZWFwPGludD4gaHA7CiAgICBmb3IoaT0oMCk7aTwobik7aSsrKXsKICAgICAgc1tpXSA9IHNwZWVkW2ldOwogICAgfQogICAgZm9yKGk9KDApO2k8KG4pO2krKyl7CiAgICAgIGVbaV0gPSBlZmZpY2llbmN5W2ldOwogICAgfQogICAgc29ydEFfTChuLGUscyk7CiAgICBocC5tYWxsb2MoaysxKTsKICAgIGZvcihpPShuKS0xO2k+PSgwKTtpLS0pewogICAgICBzbSArPSBocC5wdXNoKHNbaV0pOwogICAgICBpZihocC5zaXplID4gayl7CiAgICAgICAgc20gLT0gaHAucG9wKCk7CiAgICAgIH0KICAgICAgY2htYXgocmVzLCBzbSAqIGVbaV0pOwogICAgfQogICAgaHAuZnJlZSgpOwogICAgcmV0dXJuIHJlcyAlIE1EOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDIwMDMyNS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGludCBzWzFkNV0sIGVbMWQ1XTsKLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIGludCBtYXhQZXJmb3JtYW5jZShpbnQgbiwgdmVjdG9yPGludD4mIHNwZWVkLCB2ZWN0b3I8aW50PiYgZWZmaWNpZW5jeSwgaW50IGspIHsKLy8gICAgIGR1bW15X21haW4oKTsKLy8gCi8vICAgICBsbCByZXMgPSAwLCBzbSA9IDA7Ci8vICAgICBIZWFwPGludD4gaHA7Ci8vICAgICByZXAoaSxuKSBzW2ldID0gc3BlZWRbaV07Ci8vICAgICByZXAoaSxuKSBlW2ldID0gZWZmaWNpZW5jeVtpXTsKLy8gICAgIHNvcnRBKG4sZSxzKTsKLy8gICAgIGhwLm1hbGxvYyhrKzEpOwovLyAKLy8gICAgIHJyZXAoaSxuKXsKLy8gICAgICAgc20gKz0gaHAucHVzaChzW2ldKTsKLy8gICAgICAgaWYoaHAuc2l6ZSA+IGspIHNtIC09IGhwLnBvcCgpOwovLyAgICAgICByZXMgPj89IHNtICogZVtpXTsKLy8gICAgIH0KLy8gCi8vICAgICBocC5mcmVlKCk7Ci8vICAgICByZXR1cm4gcmVzICUgTUQ7Ci8vICAgfQovLyB9Owo=