제출 #710255

#제출 시각아이디문제언어결과실행 시간메모리
710255Darren0724Cake 3 (JOI19_cake3)C++17
24 / 100
335 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;
struct seg{
    int l,m,r;
    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;
    }
    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?new seg(*lc):new seg(l,m));
            lc->add(p);
        }
        else{
            rc=(rc?new seg(*rc):new seg(m,r));
            rc->add(p);
        }
        pull();
    }
};
vector<seg*> tr;
long long total(seg* s){
    return s?s->total:0;
}
int cnt(seg* s){
    return s?s->cnt:0;
}
long long ask(seg* a,seg* b,int need,int l,int r){
    //cout<<l<<' '<<r<<endl;
    if(r-l==1){
        return (need>cnt(b)-cnt(a)?-INF:need*l);
    }
    if(!a){
        a=new seg(l,r);
        a->lc=a->rc=NULL;
    }
    if(!b){
        b=new seg(l,r);
        b->lc=b->rc=NULL;
    }
    int m=(l+r)>>1;
    if(cnt(b->rc)-cnt(a->rc)>=need){
        return ask(a->rc,b->rc,need,m,r);
    }
    else{
        return total(b->rc)-total(a->rc)+ask(a->lc,b->lc,need-cnt(b->rc)+cnt(a->rc),l,m);
    }
}
long long ans1=-INF;
void dc(int l,int r,int a,int b){
    //cout<<l<<' '<<r<<endl;
    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,0,N)-(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;
    }
    sort(v.begin(),v.end());
    tr.resize(n+1);
    tr[0]=new seg(0,N);
    for(int i=1;i<=n;i++){
        tr[i]=new seg(*tr[i-1]);
        tr[i]->add(v[i].y);
    }
    int idx=0;
    dc(m,n+1,0,n);
    cout<<ans1<<endl;


    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

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