Submission #168802

#TimeUsernameProblemLanguageResultExecution timeMemory
168802AkashiCake 3 (JOI19_cake3)C++14
24 / 100
4029 ms14396 KiB
#include <bits/stdc++.h>
using namespace std;

const long long INF = 1e18;

struct cake{
    int v, c;
    bool operator < (const cake &aux)const{
        if(c != aux.c) return c < aux.c;
        return v > aux.v;
    }
};
cake a[200005];

int n, m;

multiset <long long> s1, s2;
long long S = 0;
void add(int i){
    if(s2.size() < m){
        s2.insert(a[i].v);
        S += a[i].v;
    }
    else{
        if(*s2.begin() < a[i].v){
            s1.insert(*s2.begin());
            S -= *s2.begin();

            s2.erase(s2.begin());
            s2.insert(a[i].v);
            S += a[i].v;
        }
        else s1.insert(a[i].v);
    }
}

void rem(int i){
    if(s2.find(a[i].v) != s2.end()){
        s2.erase(s2.find(a[i].v));
        S -= a[i].v;
        if(!s1.empty()){
            s2.insert(*s1.rbegin());
            S += *s1.rbegin();
            s1.erase(s1.find(*s1.rbegin()));
        }
    }
    else s1.erase(s1.find(a[i].v));
}

int l = 1, r = 0;
long long calc(int st, int dr){
    while(r < dr) add(++r);
    while(l > st) add(--l);
    while(l < st) rem(l++);
    while(r > dr) rem(r--);

    if(dr - st + 1 < m) return -INF;
    return S;
}

long long solve(int st, int dr, int down, int up){
    int mij = (st + dr) / 2;

    long long sol = -INF, best = 0;
    for(int i = max(down, mij); i <= up ; ++i){
        long long val = calc(mij, i) - (a[i].c - a[mij].c);
        if(val > sol){
            sol = val;
            best = i;
        }
    }

    if(st == dr || sol == -INF) return sol;

    return max(sol, max(solve(st, mij, down, best), solve(mij + 1, dr, best, up)));
}

int main()
{
    scanf("%d%d", &n, &m);

    for(int i = 1; i <= n ; ++i){
        scanf("%d%d", &a[i].v, &a[i].c);
        a[i].c *= 2;
    }

    sort(a + 1, a + n + 1);

    printf("%lld", solve(1, n - m + 1, m, n));

    return 0;
}

Compilation message (stderr)

cake3.cpp: In function 'void add(int)':
cake3.cpp:20:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(s2.size() < m){
        ~~~~~~~~~~^~~
cake3.cpp: In function 'int main()':
cake3.cpp:80:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &n, &m);
     ~~~~~^~~~~~~~~~~~~~~~
cake3.cpp:83:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &a[i].v, &a[i].c);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...