Cod sursa(job #2651516)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 22 septembrie 2020 20:06:19
Problema Fabrica Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define MAX 131072
#define MOD 1000000007
#define INF 2100000000
#define eps 1e-5

using namespace std;
const int NMAX = 100100;

struct obj{
    int index;
    long long val;
    bool operator<(const obj &a) const{
        return val > a.val;
    }
};

int N, nra, nrb;
int va[NMAX], vb[NMAX];
long long ansA, ansB;
long long tma[NMAX];

priority_queue <obj> Q, revQ;

void read(){
    scanf("%d%d%d", &N, &nra, &nrb);
    for(int i = 1; i <= nra; i++)
        scanf("%d", &va[i]);
    for(int i = 1; i <= nrb; i++)
        scanf("%d", &vb[i]);
    sort(va + 1, va + nra + 1);
    sort(vb + 1, vb + nrb + 1);
    for(int i = 1; i <= nra; i++){
        Q.push({va[i], i});
        tma[i] = va[i];
    }
}

int main(){

    freopen("fabrica.in", "r", stdin);
    freopen("fabrica.out", "w", stdout);

    read();

    int idx = nra, rest = N - nra, cnt = N;
    while(cnt){
        long long x = Q.top().val;
        while(!Q.empty() && x == Q.top().val){
            int a = Q.top().index;
            Q.pop();
            if(rest){
                Q.push({x + va[a], a});
                tma[a] = x + va[a];
                --rest;
            } else if(tma[idx] > x + va[a]){
                Q.push({x + va[a], a});
                tma[a] = x + va[a];
                --idx;
            }
            cnt--;
        }
        ansA = max(ansA, x);
    }
    printf("%d", ansA);

    return 0;
}