Submission #710196

#TimeUsernameProblemLanguageResultExecution timeMemory
710196Darren0724Cake 3 (JOI19_cake3)C++17
24 / 100
323 ms262144 KiB
#include<bits/stdc++.h>
using namespace std;
#define all(x) x.begin(),x.end()
#define x first
#define y second
const long long INF=1e18;
const int N=1000000005;
int n,m;
vector<pair<int,int>> v;
int cnt12=0;
struct seg{
    int l,m,r;
    //seg *lc,*rc;
    shared_ptr<seg> lc,rc;
    long long cnt=0,total=0;
    seg(int l1,int r1){
        l=l1,r=r1;
        m=(l+r)>>1;
        lc=rc=NULL;
        cnt12++;
    }
    void pull(){
        cnt=0;
        total=0;
        if(lc){
            cnt+=lc->cnt;
            total+=lc->total;
        }
        if(rc){
            cnt+=rc->cnt;
            total+=rc->total;
        }
    }
    void add(int p){
        if(r-l==1){
            cnt++;
            total+=p;
            return;
        }
        m=(l+r)>>1;
        if(p<m){
            lc=(lc?shared_ptr<seg>(new seg(*lc)):shared_ptr<seg>(new seg(l,m)));
            lc->add(p);
        }
        else{
            rc=(rc?shared_ptr<seg>(new seg(*rc)):shared_ptr<seg>(new seg(m,r)));
            rc->add(p);
        }
        pull();
    }
};
vector<shared_ptr<seg>> tr;
long long ask(shared_ptr<seg> a,shared_ptr<seg> b,int need){
    if(a->r-a->l==1){
        return (need>b->cnt-a->cnt?-INF:need*a->l);
    }
    if(!a->lc){
        a->lc=shared_ptr<seg>(new seg(a->l,a->m));
    }
    if(!a->rc){
        a->rc=shared_ptr<seg>(new seg(a->m,a->r));
    }
    if(!b->lc){
        b->lc=shared_ptr<seg>(new seg(b->l,b->m));
    }
    if(!b->rc){
        b->rc=shared_ptr<seg>(new seg(b->m,b->r));
    }
    if(b->rc->cnt-a->rc->cnt>=need){
        return ask(a->rc,b->rc,need);
    }
    else{
        return b->rc->total-a->rc->total+ask(a->lc,b->lc,need-b->rc->cnt+a->rc->cnt);
    }
}
long long ans1=-INF;
void dc(int l,int r,int a,int b){
    if(l>=r){
        return;
    }
    pair<long long,int> p={-INF,-1};
    int m1=(l+r)>>1;
    for(int i=a;i<=min(b,m1-1);i++){
        p=max(p,{ask(tr[i],tr[m1],m)-(v[m1].x-v[i+1].x)*2,i});
        //cout<<m1<<' '<<i<<endl;
    }
    ans1=max(ans1,p.first);
    dc(l,m1,a,p.second);
    dc(m1+1,r,p.second,b);
}
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    v.resize(n+1);
    for(int i=1;i<=n;i++){
        cin>>v[i].y>>v[i].x;
        //v[i].x=v[i].y=100+i*1000;
    }
    sort(v.begin(),v.end());
    tr.resize(n+1);
    tr[0]=shared_ptr<seg>(new seg(0,N));
    for(int i=1;i<=n;i++){
        tr[i]=shared_ptr<seg>(new seg(*tr[i-1]));
        tr[i]->add(v[i].y);
    }
    int idx=0;
    dc(m,n+1,0,n);
    cout<<ans1<<endl;
    //cout<<cnt12<<endl;

    return 0;
}


Compilation message (stderr)

cake3.cpp: In function 'int32_t main()':
cake3.cpp:107:9: warning: unused variable 'idx' [-Wunused-variable]
  107 |     int idx=0;
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...