A
题解
代码
B
题解
代码
C
题解
三分,对于怎么看出来三分,这可能是个套路,你觉得这个题你用贪心做不了(但非常像贪心),二分答案会被hack,然后你$dp$也难以做,你三分就可以了
三分$check$贪心做,很水,我会说
代码
/* n*log^2 */ #include<bits/stdc++.h> using namespace std; #define ll long long #define A 222222 struct node{ ll l,r; friend bool operator < (const node & a,const node &b){ return a.l==b.l?a.r>b.r:a.l<b.l; } }wat[A]; ll n,m,t,ans=0x7fffffffffffff,maxx=0,cnt=0; ll p[A],lef[A],now[A],c[A]; ll check(ll x){ ll sum=0; for(ll i=1;i<=n;i++){ now[i]=max(p[i]-x,0ll); c[i]=0; } for(ll i=1;i<=n;i++){ ll nowid=lef[i]; c[i]+=c[i-1]; if(lef[i]==0) continue ; ll cha=c[i]; // printf("i=%lld c[i]=%lld c[i-1]=%lld\n",i,c[i],c[i-1]); // printf("i=%lld now+cha=%lld\n",i,now[i]+cha); if(now[i]+cha>0){ sum+=now[i]+cha; c[i]-=(now[i]+cha); c[wat[nowid].r+1]+=now[i]+cha; now[i]=0; } } for(ll i=1;i<=n;i++){ ll cha=c[i]; // printf("now=%lld x=%lld cha=%lld\n",now[i],x,cha); if(now[i]+cha>0) return 0x7fffffffff; } return sum+x*t; } int main(){ // freopen("da.in","r",stdin); // freopen("ans.bf","w",stdout); scanf("%lld%lld%lld",&n,&m,&t); for(ll i=1;i<=n;i++){ scanf("%lld",&p[i]); maxx=max(maxx,p[i]); } for(ll i=1;i<=m;i++){ scanf("%lld%lld",&wat[i].l,&wat[i].r); } sort(wat+1,wat+m+1); for(ll i=1;i<=m;i++){ if(!lef[wat[i].l]) lef[wat[i].l]=i; } for(ll i=1;i<=n;i++) if(wat[lef[i-1]].r>=i){ if(wat[lef[i-1]].r>wat[lef[i]].r) lef[i]=lef[i-1]; } ll l=0,r=maxx; while(l<r){ ll len=(r-l); ll lmid=l+len/3,rmid=r-len/3; ll lnow=check(lmid),rnow=check(rmid); // printf("l=%lld r=%lld\n",l,r); if(lnow>=rnow) l=lmid+1; else r=rmid-1; ans=min(ans,lnow); ans=min(ans,rnow); } // printf("%lld\n",check(5)); printf("%lld\n",ans); }