补一发题解。。

整体二分这个东西,一开始感觉复杂度不是很靠谱的样子

问了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 }
View Code

相关文章:

  • 2021-12-10
  • 2021-10-16
  • 2022-12-23
  • 2022-02-10
  • 2021-06-17
  • 2021-11-03
  • 2021-11-14
  • 2021-09-10
猜你喜欢
  • 2021-12-06
  • 2021-10-23
  • 2021-07-31
  • 2022-12-23
相关资源
相似解决方案