首页 > 代码库 > 【BZOJ2120】数颜色

【BZOJ2120】数颜色

看代码学习好,好学好懂好ac

原题:

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。3

 

带修改的莫队裸题

额外增加一维表示时间,排序的时候优先级设为最底,然后莫队即可……

贡献什么的很好想,就不说了

注意想清楚时间轴和答案的关系

看代码学习好,好学好懂好ac

代码:

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int rd(){int z=0,mk=1;  char ch=getchar();
 8     while(ch<0||ch>9){if(ch==-)mk=-1;  ch=getchar();}
 9     while(ch>=0&&ch<=9){z=(z<<3)+(z<<1)+ch-0;  ch=getchar();}
10     return z*mk;
11 }
12 struct dcd{int x,y,z,id;}b[110000],c[110000];  int tt=0;
13 int n,m,a[110000];  int blck;
14 int l,r,t=0;
15 int cnt[1100000],nm=0;
16 int ans[110000];
17 bool cmp(dcd x,dcd y){
18     return (x.x/blck==y.x/blck ? (x.y/blck==y.y/blck ? x.z<y.z : x.y<y.y) : x.x<y.x);
19 }
20 void chg(int x,int y){
21     if(l<=x && x<=r){
22         --cnt[a[x]];  nm-=(!cnt[a[x]]);
23         a[x]=y;
24         nm+=(!cnt[a[x]]);  ++cnt[a[x]];
25     }
26     else  a[x]=y;
27 }
28 void updt(int x,int y){
29     nm+=(!cnt[a[x]]);  cnt[a[x]]+=y;  nm-=(!cnt[a[x]]);
30     /*cout<<x<<" "<<y<<endl;
31     for(int i=1;i<=6;++i)  cout<<cnt[i]<<" ";
32     cout<<endl;*/
33 }
34 int main(){//freopen("ddd.in","r",stdin);
35     cin>>n>>m;  blck=(int)sqrt(n*1.0);
36     for(int i=1;i<=n;++i)  a[i]=rd();
37     char s[10];
38     for(int i=1;i<=m;++i){
39         scanf("%s",s);  l=rd(),r=rd();
40         if(s[0]==Q)  b[++tt].z=t,b[tt].x=l,b[tt].y=r,b[tt].id=tt;
41         else  c[++t].x=l,c[t].y=r,c[t].z=a[l],a[l]=r;
42     }
43     for(int i=t;i>=1;--i)  a[c[i].x]=c[i].z;
44     sort(b+1,b+tt+1,cmp);
45     l=1,r=0,t=0;
46     for(int i=1;i<=tt;++i){
47         while(t<b[i].z)  ++t,chg(c[t].x,c[t].y);
48         while(t>b[i].z)  chg(c[t].x,c[t].z),--t;
49         while(r<b[i].y)  ++r,updt(r,1);
50         while(r>b[i].y)  updt(r,-1),--r;
51         while(l<b[i].x)  updt(l,-1),++l;
52         while(l>b[i].x)  --l,updt(l,1);
53         //cout<<i<<endl;
54     /*cout<<l<<" "<<r<<" "<<t<<" "<<nm<<endl;
55     for(int j=1;j<=6;++j)  cout<<cnt[j]<<" ";
56     cout<<endl;
57     for(int j=1;j<=n;++j)  cout<<a[j]<<" ";
58     cout<<endl;*/
59         ans[b[i].id]=nm;
60     }
61     for(int i=1;i<=tt;++i)  printf("%d\n",ans[i]);
62     return 0;
63 }
View Code

 

【BZOJ2120】数颜色