Submission #1354926

#TimeUsernameProblemLanguageResultExecution timeMemory
1354926kokokaiCake 3 (JOI19_cake3)C++20
0 / 100
0 ms344 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
#define task "text"
#define int long long
const int N = 200001;
int n;
int v[N],c[N];
vector<ll> merg(vector<ll> a,vector<ll> b,int i1=0,int i2=0){
    vector<ll> r;
    r.push_back(0LL);
    if(i1 == 1 && i2 == 1){
        r.push_back(-9e17);
        r.push_back(a[i1]+b[i2]);
    }else{
        if(i1 == 1){
            r.push_back(a[i1]+b[i2]);
        }else if(i2 == 1){
            r.push_back(a[i1]+b[i2]);
        }
    }
    while(i1+1 < a.size() || i2+1 < b.size()){
        int v1,v2;
        if(i1+1 < a.size()) v1=a[i1+1]-a[i1];
        else v1=-9e17;
        if(i2+1 < b.size()) v2=b[i2+1]-b[i2];
        else v2=-9e17;
        if(v1 >= v2){
            i1++;
            r.push_back(a[i1]+b[i2]);
        }else{
            i2++;
            r.push_back(a[i1]+b[i2]);
        }
    }
    return r;
}
vector<ll> comb(vector<ll> a,vector<ll> b){
    if(a.size() > b.size()) swap(a,b);
    vector<ll> ret;
    for(int i=0;i<a.size();i++){
        ret.push_back(max(a[i],b[i]));
    }
    for(int i=a.size();i<b.size();i++){
        ret.push_back(b[i]);
    }
    return ret;
}
vector<vector<ll>> dnc(int l,int r){
    //vec[0] = ket qua
    //vec[1] = chi cong o left
    //vec[2] = chi tru o right
    //vec[3] = sum

    if(l == r){
        vector<vector<ll>> ret;
        vector<ll> ve;
        ve.push_back(0LL);
        ve.push_back(v[l]);
        ret.push_back(ve);
        ve.resize(1);
        ve.push_back(c[l]+v[l]);
        ret.push_back(ve);
        ve.resize(1);
        ve.push_back(v[l]-c[l]);
        ret.push_back(ve);
        ve.clear();
        ve.push_back(0LL);
        ve.push_back(v[l]);
        ret.push_back(ve);
        //if(l == 2) cerr<<ret.size()<<'\n';
        return ret;
    }

    int mid=(l+r)>>1;
    vector<vector<ll>> a=dnc(l,mid);
    vector<vector<ll>> b=dnc(mid+1,r);

    vector<vector<ll>> res;
    vector<ll> v=comb(a[0],b[0]);

    v=comb(v,merg(a[1],b[2],1,1));

    res.push_back(v);

    v.clear();
    v=comb(a[1],b[1]);
    //cerr<<b[3].size()<<'\n';
    v=comb(v,merg(a[1],b[3],1,0));
    //cerr<<a[1].size()<<' '<<r<<'\n';
    res.push_back(v);
    v.clear();
    v=comb(a[2],b[2]);
    v=comb(v,merg(a[3],b[2],0,1));
    res.push_back(v);
    v.clear();
    v=merg(a[3],b[3],0,0);
    res.push_back(v);

    return res;
}
pair<int,int> arr[N];
signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr);
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
    }
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>c[i];
    for(int i=1;i<=n;i++) c[i]*=2LL;
    for(int i=1;i<=n;i++){
        arr[i]={c[i],v[i]};
    }
    sort(arr+1,arr+1+n);
    for(int i=1;i<=n;i++){
        c[i]=arr[i].fi;
        v[i]=arr[i].se;
    }
    //for(int i=1;i<=n;i++) cerr<<v[i]<<' '<<c[i]<<'\n';
    vector<vector<ll>> v=dnc(1,n);
    cout<<v[0][m];
}


Compilation message (stderr)

cake3.cpp: In function 'int main()':
cake3.cpp:108:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |         freopen(task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...