Submission #66901926


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int m=1e5;
typedef long long ll;
int n; ll c,d;
ll a[N]; 
ll sum;

struct segtree{
    #define maxx N*4
    #define ls x<<1
    #define rs x<<1|1
    ll mn[maxx],mx[maxx],add[maxx],cov[maxx];
    ll sum[maxx]; int len[maxx];
    void push_up(int x) {
        mn[x]=min(mn[ls],mn[rs]);
        mx[x]=max(mx[ls],mx[rs]);
        sum[x]=sum[ls]+sum[rs];
    }
    void build(int x,int l,int r) {
        len[x]=r-l+1;
        if(l==r) return;
        int mid=(l+r)>>1;
        build(ls,l,mid); build(rs,mid+1,r);
    }
    void cover(int x,ll w) {
        add[x]=0; cov[x]=w;
        mn[x]=mx[x]=w;
        sum[x]=1ll*len[x]*w;
    }
    void adding(int x,ll w) {
        add[x]+=w; 
        mn[x]+=w; mx[x]+=w;
        sum[x]+=1ll*len[x]*w;
    }
    void push_down(int x) {
        if(cov[x]) {
            cover(ls,cov[x]);
            cover(rs,cov[x]);
            cov[x]=0; 
        }
        if(add[x]) {
            adding(ls,add[x]);
            adding(rs,add[x]);
            add[x]=0;
        }
    }
    void updateAdd(int x,int l,int r,int a,int b,ll w) {
        if(l>=a&&r<=b) {
            adding(x,w);
            return;
        }
        push_down(x);
        int mid=(l+r)>>1;
        if(mid>=a) updateAdd(ls,l,mid,a,b,w);
        if(mid+1<=b) updateAdd(rs,mid+1,r,a,b,w);
        push_up(x);
    }
    void updateCover(int x,int l,int r,int a,int b,ll w) {
        if(l>=a&&r<=b) {
            cover(x,w);
            return;
        }
        push_down(x);
        int mid=(l+r)>>1;
        if(mid>=a) updateCover(ls,l,mid,a,b,w);
        if(mid+1<=b) updateCover(rs,mid+1,r,a,b,w);
        push_up(x);
    }
    int queryMin(int x,int l,int r,ll w) {
        if(l==r) {
            if(mn[x]>=w) return l;
            return m+1;
        }
        push_down(x);
        int mid=(l+r)>>1;
        if(mx[ls]>=w) return queryMin(ls,l,mid,w);
        else return queryMin(rs,mid+1,r,w);
    }
    int queryMax(int x,int l,int r,ll w) {
        if(l==r) {
            if(mx[x]<=w) return l;
            return -m;
        }
        push_down(x);
        int mid=(l+r)>>1;
        if(mn[rs]<=w) return queryMax(rs,mid+1,r,w);
        else return queryMax(ls,l,mid,w);
    }
    ll query(int x,int l,int r,int a) {
        if(l==r) return mx[x];
        push_down(x);
        int mid=(l+r)>>1;
        if(mid>=a) return query(ls,l,mid,a);
        else return query(rs,mid+1,r,a);
    }
    ll querySum(int x,int l,int r,int a,int b) {
        if(l>=a&&r<=b) return sum[x];
        push_down(x);
        int mid=(l+r)>>1;
        ll ans=0;
        if(mid>=a) ans+=querySum(ls,l,mid,a,b);
        if(mid+1<=b) ans+=querySum(rs,mid+1,r,a,b);
        return ans;
    }
}t;
int lpos[N],rpos[N];

void debugger() {
    printf("--%lld\n",sum);
    for(int i=-m+1;i<=m;i++) printf("%lld ", t.query(1,-m,m,i));
    puts("");
}
int ans[N];
int main() {
    t.build(1,-m,m);
    scanf("%d%lld%lld",&n,&c,&d);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    ll pos=-m;
    sum=-pos*c;
    t.updateCover(1,-m,m,-m,0,-c);
    t.updateCover(1,-m,m,1,m,c);
   // debugger();
    for(int i=1;i<=n;i++) {
        sum+=abs(pos-a[i])*d;
        //debugger();
        int lc=t.queryMax(1,-m,m,-c);
        int rc=t.queryMin(1,-m,m,c);
        if(lc>-m) {
            ll sm=t.querySum(1,-m,m,-m+1,lc);
            sum-=(-sm-1ll*c*(m+lc));
            t.updateCover(1,-m,m,-m,lc,-c);
        }
        if(rc!=m+1) t.updateCover(1,-m,m,rc,m,c);
        lpos[i]=lc; rpos[i]=rc-1;
        t.updateAdd(1,-m,m,-m,a[i],-d);
        if(a[i]+1<=m) t.updateAdd(1,-m,m,a[i]+1,m,d);
        //debugger();
    }
    for(int i=-m+1;i<=m;i++) {
        ll w=t.query(1,-m,m,i);
        if(w<=0) sum+=w,pos=i;
        else break;
    }
    printf("%lld\n",sum);
    ans[n]=pos;
    for(int i=n;i>=2;i--) {
        pos=min(pos,(ll)rpos[i]);
        pos=max(pos,(ll)lpos[i]);
        ans[i-1]=pos;
    } 
    for(int i=1;i<=n;i++) printf("%d ",ans[i]);
}

Submission Info

Submission Time
Task G - Travelling Salesman Problem
User cjh_hhz
Language C++ 20 (gcc 12.2)
Score 625
Code Size 4151 Byte
Status AC
Exec Time 374 ms
Memory 30412 KiB

Compile Error

Main.cpp: In function ‘int main()’:
Main.cpp:118:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  118 |     scanf("%d%lld%lld",&n,&c,&d);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:119:32: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  119 |     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
      |                           ~~~~~^~~~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 625 / 625
Status
AC × 3
AC × 48
Set Name Test Cases
Sample sample00.txt, sample01.txt, sample02.txt
All sample00.txt, sample01.txt, sample02.txt, testcase00.txt, testcase01.txt, testcase02.txt, testcase03.txt, testcase04.txt, testcase05.txt, testcase06.txt, testcase07.txt, testcase08.txt, testcase09.txt, testcase10.txt, testcase11.txt, testcase12.txt, testcase13.txt, testcase14.txt, testcase15.txt, testcase16.txt, testcase17.txt, testcase18.txt, testcase19.txt, testcase20.txt, testcase21.txt, testcase22.txt, testcase23.txt, testcase24.txt, testcase25.txt, testcase26.txt, testcase27.txt, testcase28.txt, testcase29.txt, testcase30.txt, testcase31.txt, testcase32.txt, testcase33.txt, testcase34.txt, testcase35.txt, testcase36.txt, testcase37.txt, testcase38.txt, testcase39.txt, testcase40.txt, testcase41.txt, testcase42.txt, testcase43.txt, testcase44.txt
Case Name Status Exec Time Memory
sample00.txt AC 11 ms 16220 KiB
sample01.txt AC 12 ms 16220 KiB
sample02.txt AC 12 ms 16280 KiB
testcase00.txt AC 283 ms 29256 KiB
testcase01.txt AC 360 ms 30252 KiB
testcase02.txt AC 245 ms 28736 KiB
testcase03.txt AC 361 ms 30064 KiB
testcase04.txt AC 246 ms 28944 KiB
testcase05.txt AC 358 ms 30256 KiB
testcase06.txt AC 306 ms 29732 KiB
testcase07.txt AC 354 ms 30168 KiB
testcase08.txt AC 271 ms 29176 KiB
testcase09.txt AC 374 ms 30160 KiB
testcase10.txt AC 228 ms 28672 KiB
testcase11.txt AC 370 ms 30288 KiB
testcase12.txt AC 282 ms 29380 KiB
testcase13.txt AC 371 ms 30140 KiB
testcase14.txt AC 260 ms 29280 KiB
testcase15.txt AC 354 ms 30388 KiB
testcase16.txt AC 232 ms 28796 KiB
testcase17.txt AC 370 ms 30132 KiB
testcase18.txt AC 275 ms 29236 KiB
testcase19.txt AC 368 ms 30156 KiB
testcase20.txt AC 351 ms 30412 KiB
testcase21.txt AC 219 ms 30264 KiB
testcase22.txt AC 219 ms 30184 KiB
testcase23.txt AC 261 ms 30264 KiB
testcase24.txt AC 305 ms 30176 KiB
testcase25.txt AC 211 ms 30380 KiB
testcase26.txt AC 212 ms 30336 KiB
testcase27.txt AC 219 ms 30140 KiB
testcase28.txt AC 305 ms 30404 KiB
testcase29.txt AC 221 ms 30256 KiB
testcase30.txt AC 223 ms 30264 KiB
testcase31.txt AC 265 ms 30164 KiB
testcase32.txt AC 356 ms 30268 KiB
testcase33.txt AC 220 ms 30264 KiB
testcase34.txt AC 218 ms 30376 KiB
testcase35.txt AC 263 ms 30408 KiB
testcase36.txt AC 303 ms 30132 KiB
testcase37.txt AC 224 ms 30140 KiB
testcase38.txt AC 221 ms 30268 KiB
testcase39.txt AC 266 ms 30308 KiB
testcase40.txt AC 11 ms 16284 KiB
testcase41.txt AC 72 ms 18404 KiB
testcase42.txt AC 130 ms 30224 KiB
testcase43.txt AC 108 ms 18148 KiB
testcase44.txt AC 125 ms 28328 KiB