Pagini recente » Cod sursa (job #3207496) | Cod sursa (job #3144227) | Borderou de evaluare (job #200897) | Borderou de evaluare (job #1321531) | Cod sursa (job #2412355)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("fabrica.in");
ofstream g("fabrica.out");
int i,n,nA,nB,v[50001][2],h[50001],p[50001];
long long t[100001][2],Max;
int verif(int a,int b,int c){
if(h[a]<h[b])
return 1;
if(h[a]==h[b]&&v[a][c]<v[b][c])
return 1;
return 0;
}
void down_heap(int poz,int k,int c){
while(poz*2<=k){
int st=poz*2;
if(st+1<=k)
st+=verif(st+1,st,c);
if(h[poz]>h[st]){
swap(h[st],h[poz]);
swap(p[poz],p[st]);
}
poz=st;
}
}
void solve(int c,int k){
for(i=1;i<=k;i++){
h[i]=v[i][c];
p[i]=i;
}
for(i=1;i<=k;i++)
down_heap(i,k,c);
for(i=1;i<=n;i++){
t[i][c]=h[1];
h[1]+=v[p[1]][c];
down_heap(1,k,c);
}
memset(h,0,sizeof(h));
}
int main()
{ f>>n>>nA>>nB;
for(i=1;i<=nA;i++)
f>>v[i][0];
for(i=1;i<=nB;i++)
f>>v[i][1];
solve(0,nA);
g<<t[n][0]<<' ';
solve(1,nB);
Max=0;
for(i=1;i<=n;i++)
Max=max(Max,t[i][0]+t[n-i+1][1]);
g<<Max;
return 0;
}