传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2527
整体二分没什么好说的,注意该开longlong的地方开longlong
Code:
#include<bits/stdc++.h> using namespace std; const int maxn=3e5+5; int n,m,k; typedef long long LL; vector<int>O[maxn]; int getint(){ int res=0;char c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c))res=res*10+c-'0',c=getchar(); return res; } struct BIT{ LL d[maxn]; inline int lowbit(int x){return x&-x;} LL get(int x){ LL ans=0; while(x)ans+=d[x],x-=lowbit(x); return ans; } void updata(int x,LL f){ while(x<=m)d[x]+=f,x+=lowbit(x); } void add(int l,int r,LL f){ updata(l,f); updata(r+1,-f); } }T,T2; int anss[maxn],wana[maxn]; struct qes{ LL x,y,z; qes(LL _x=0,LL _y=0,LL _z=0): x(_x),y(_y),z(_z){} }q[maxn],p[maxn]; bool part(qes &q){ if(q.y+q.z>=wana[q.x])return 1; q.z+=q.y;q.y=0;return 0; } void solve(int lef,int rig,int l,int r){ if(l==r){ for(int i=lef;i<=rig;i++)if(anss[p[i].x]!=-1) anss[p[i].x]=l;return; }int mid=(l+r)>>1; for(int i=l;i<=mid;i++){ if(q[i].x<=q[i].y)T.add(q[i].x,q[i].y,q[i].z); else T.add(1,q[i].y,q[i].z),T.add(q[i].x,m,q[i].z); }for(int i=lef;i<=rig;i++){ p[i].y=0; for(int j=0;j<O[p[i].x].size()&&p[i].y<=int(1e9)+1;j++) p[i].y+=T.get(O[p[i].x][j]); }for(int i=l;i<=mid;i++){ if(q[i].x<=q[i].y)T.add(q[i].x,q[i].y,-q[i].z); else T.add(1,q[i].y,-q[i].z),T.add(q[i].x,m,-q[i].z); }int dv=stable_partition(p+lef,p+rig+1,part)-p-1; if(lef<=dv) solve(lef,dv,l,mid); if(dv+1<=rig) solve(dv+1,rig,mid+1,r); } int main(){ n=getint();m=getint(); for(int i=1;i<=m;i++){ int x=getint();O[x].push_back(i); }for(int i=1;i<=n;i++)wana[i]=getint(),p[i]=qes(i,0,0); k=getint(); for(int i=1;i<=k;i++){ int l=getint(),r=getint(),x=getint(); q[i]=qes(l,r,x); }q[++k]=qes(1,m,int(1e9)+1); solve(1,n,1,k); for(int i=1;i<=n;i++)if(anss[i]!=k) printf("%d\n",anss[i]);else puts("NIE"); return 0; }