Pagini recente » Cod sursa (job #335905) | Cod sursa (job #2118502) | Cod sursa (job #2704374) | Cod sursa (job #796181) | Cod sursa (job #586184)
Cod sursa(job #586184)
#include <algorithm>
#include <stdio.h>
#include <set>
#define MAX 100010
#define mp make_pair
#define f first
#define s second
using namespace std;
int n, nra, nrb;
multiset <int> setDur;
multiset <pair <int, int> > setMom, setDis;
int vctIn[MAX];
int main()
{
freopen("fabrica.in", "r", stdin);
freopen("fabrica.out", "w", stdout);
scanf("%d %d %d", &n, &nra, &nrb);
for (int i = 1; i <= nra; i++)
{
int dur;
scanf("%d", &dur);
setMom.insert(mp(0, dur));
}
for (int i = 1; i <= nrb; i++)
{
int dur;
scanf("%d", &dur);
setDur.insert(dur);
}
for (; vctIn[0] < n; )
{
int mom = setMom.begin()->f;
int dur = setMom.begin()->s;
setMom.erase(setMom.begin());
if (mom != 0)
vctIn[++vctIn[0]] = mom;
setMom.insert(mp(mom + dur, dur));
}
int m1 = vctIn[n], m2 = 0, df = 0;
for (int i = n; i; i--)
{
vctIn[i] -= df;
for (; setDis.begin() != setDis.end(); setDis.erase(setDis.begin()))
if (setDis.begin()->f <= -vctIn[i])
setDur.insert(setDis.begin()->s);
else break;
if (!setDur.size())
{
df += setDis.begin()->f + vctIn[i];
vctIn[i] = -setDis.begin()->f;
for (; setDis.begin() != setDis.end(); setDis.erase(setDis.begin()))
if (setDis.begin()->f <= -vctIn[i])
setDur.insert(setDis.begin()->s);
else break;
}
int dur = (*setDur.begin());
setDur.erase(setDur.begin());
m2 = max(m2, vctIn[i] + dur);
setDis.insert(mp(-(vctIn[i] - dur), dur));
}
printf("%d %d\n", m1, m2 + df);
fclose(stdin);
fclose(stdout);
return 0;
}