제출 #903989

#제출 시각아이디문제언어결과실행 시간메모리
903989ansol4328Salesman (IOI09_salesman)C++14
32 / 100
1244 ms65536 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back

using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
const ll INF=1e18;

struct SegTree{
    vector<ll> mx, lz;
    int base;
    SegTree(int a){
        base=1;
        while(base<a) base<<=1;
        mx.resize(base*2);
        lz.resize(base*2);
    }
    void pro(int ns, int nf, int num){
        if(ns<nf && lz[num]){
            lz[num*2]+=lz[num];
            lz[num*2+1]+=lz[num];
        }
        mx[num]+=lz[num];
        lz[num]=0;
    }
    void add(ll v, int st, int fn, int ns=1, int nf=-1, int num=1){
        if(nf==-1) nf=base;
        pro(ns,nf,num);
        if(nf<st || fn<ns) return;
        if(st<=ns && nf<=fn){
            lz[num]+=v;
            pro(ns,nf,num);
            return;
        }
        int mid=(ns+nf)>>1;
        add(v,st,fn,ns,mid,num*2);
        add(v,st,fn,mid+1,nf,num*2+1);
        mx[num]=max(mx[num*2],mx[num*2+1]);
    }
    ll qry(int st, int fn, int ns=1, int nf=-1, int num=1){
        if(nf==-1) nf=base;
        pro(ns,nf,num);
        if(nf<st || fn<ns) return -INF;
        if(st<=ns && nf<=fn) return mx[num];
        int mid=(ns+nf)>>1;
        return max(qry(st,fn,ns,mid,num*2),qry(st,fn,mid+1,nf,num*2+1));
    }
};

struct fenwick{
    vector<ll> s;
    int sz;
    fenwick(int a) : s(a+5), sz(a) {}
    void updt(int i, int v){
        for(; i<=sz ; i+=i&-i) s[i]+=v;
    }
    ll qry(int i){
        ll ret=0;
        for(; i ; i-=i&-i) ret+=s[i];
        return ret;
    }
};

ll N, U, D, S;
vector<P> lst[500005];
ll dp[500005];
const int E=500001;

int main(){
    cin.tie(0)->sync_with_stdio(false);
    cin >> N >> U >> D >> S;
    for(int i=1 ; i<=N ; i++){
        int x, y, z;
        cin >> x >> y >> z;
        lst[x].pb({y,z});
    }
    SegTree L(E), R(E);
    fenwick SL(E), SR(E);
    for(int i=1 ; i<=E ; i++){
        if(i<=S) dp[i]=-U*(S-i);
        else dp[i]=-D*(i-S);
        L.add(dp[i]+D*i,i,i);
        R.add(dp[i]-U*i,i,i);
    }
    for(int i=1 ; i<E ; i++){
        for(auto& [y, z] : lst[i-1]){
            SL.updt(y,-z), SR.updt(E-y+1,-z);
            if(y<E) L.add(z,y+1,E);
            if(y>1) R.add(z,1,y-1);
        }
        for(auto& [y, z] : lst[i]){
            SL.updt(y,z), SR.updt(E-y+1,z);
            if(y<E) L.add(-z,y+1,E);
            if(y>1) R.add(-z,1,y-1);
        }
        vector<vector<ll>> tmp;
        for(auto& [y, z] : lst[i]){
            ll pr=dp[y];
            if(y>1){
                dp[y]=max(dp[y], -D*y+SL.qry(y)+L.qry(1,y-1));
                // cout << L.qry(1,y-1) << ' ';
                // cout << -D*y+SL.qry(y)+L.qry(1,y-1) << "  |  ";
            }
            if(y<E){
                dp[y]=max(dp[y], U*y+SR.qry(E-y+1)+R.qry(y+1,E));
                // cout << R.qry(y+1,E) << ' ';
                // cout << U*y+SR.qry(E-y+1)+R.qry(y+1,E) << ' ';
            }
            if(pr!=dp[y]) tmp.pb({y,pr,dp[y]});
            // cout << dp[y];
            // cout << endl;
        }
        for(auto &v : tmp){
            L.add(-v[1]+v[2],v[0],v[0]);
            R.add(-v[1]+v[2],v[0],v[0]);
        }
    }
    ll ans=0;
    for(int i=1 ; i<=E ; i++){
        if(i<=S) ans=max(ans,dp[i]-D*(S-i));
        else ans=max(ans,dp[i]-U*(i-S));
    }
    cout << ans;
    return 0;
}

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

salesman.cpp: In function 'int main()':
salesman.cpp:88:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   88 |         for(auto& [y, z] : lst[i-1]){
      |                   ^
salesman.cpp:93:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   93 |         for(auto& [y, z] : lst[i]){
      |                   ^
salesman.cpp:99:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   99 |         for(auto& [y, z] : lst[i]){
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...