【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 }