补一发题解。。
整体二分这个东西,一开始感觉复杂度不是很靠谱的样子
问了po姐姐,说套主定理硬干。。
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define inf 1e9 4 #define N 300005 5 using namespace std; 6 inline int read(){ 7 int x=0,f=1;char ch=getchar(); 8 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 9 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 10 return x*f; 11 } 12 int n,m,K,T; 13 int p[N],ans[N],tmp[N],l[N],r[N],val[N],id[N]; 14 ll t[N]; 15 vector<int> a[N]; 16 bool mark[N]; 17 void add(int x,int val){ 18 for(int i=x;i<=m;i+=i&(-i))t[i]+=val; 19 } 20 void update(int k,int f){ 21 if(l[k]<=r[k]) 22 add(l[k],f*val[k]),add(r[k]+1,-(f*val[k])); 23 else{ 24 add(1,f*val[k]),add(r[k]+1,-(f*val[k])); 25 add(l[k],f*val[k]); 26 } 27 } 28 ll query(int x){ 29 ll tmp=0; 30 for(int i=x;i;i-=i&(-i))tmp+=t[i]; 31 return tmp; 32 } 33 void solve(int l,int r,int L,int R){ 34 if(l>r)return; 35 if(L==R){ 36 for(int i=l;i<=r;i++)ans[id[i]]=L; 37 return; 38 } 39 int mid=L+R>>1; 40 while(T<=mid)T++,update(T,1); 41 while(T>mid)update(T,-1),T--; 42 int cnt=0,now;ll tot; 43 for(int i=l;i<=r;i++){ 44 tot=0;now=id[i]; 45 for(int j=0;j<a[now].size();j++){ 46 tot+=query(a[now][j]); 47 if(tot>=p[now])break; 48 } 49 if(tot>=p[now])mark[now]=1,cnt++; 50 else mark[now]=0; 51 } 52 int l1=l,l2=l+cnt; 53 for(int i=l;i<=r;i++) 54 if(mark[id[i]])tmp[l1++]=id[i]; 55 else tmp[l2++]=id[i]; 56 for(int i=l;i<=r;i++)id[i]=tmp[i]; 57 solve(l,l1-1,L,mid); 58 solve(l1,l2-1,mid+1,R); 59 } 60 int main(){ 61 n=read();m=read(); 62 for(int i=1;i<=m;i++){ 63 int x=read();a[x].push_back(i); 64 } 65 for(int i=1;i<=n;i++)p[i]=read(); 66 K=read(); 67 for(int i=1;i<=K;i++){ 68 l[i]=read();r[i]=read();val[i]=read(); 69 } 70 K++; 71 l[K]=1;r[K]=m;val[K]=inf; 72 for(int i=1;i<=n;i++)id[i]=i; 73 solve(1,n,1,K); 74 for(int i=1;i<=n;i++) 75 if(ans[i]!=K)printf("%d\n",ans[i]); 76 else puts("NIE"); 77 return 0; 78 }