BSOI4559 -- 【模拟试题】数颜色

来源:互联网 发布:梦冒险知乎 编辑:程序博客网 时间:2024/06/05 05:38

BSOI4559 -- 【模拟试题】数颜色

Description

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

Input

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。
第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。
第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

Output

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

Sample Input

6 51 2 3 4 5 5Q 1 4Q 2 6R 1 2Q 1 4Q 2 6

Sample Output

4434

Hint

【数据范围】
对于100%的数据,N≤10000,M≤20000,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
借用LYM的代码:
#include<iostream>#include<algorithm>#include<cmath>using namespace std;struct ryl{int a,l,r,i,ti;}a[2000005];struct ry{int pos,col,pre;}b[2000005];int v[2000005],pos[2000005],col[2000005],ans,ct[2000005],n,m,jl,cnt1,cnt2,pre[2000005];int Ans[2000005];int ryll(){int r=0;char c=getchar();while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')r=r*10+c-'0',c=getchar();return r;}bool cmp(ryl p,ryl q){if(pos[p.l]==pos[q.l]){if(p.r==q.r){return p.ti<q.ti;}return p.r<q.r;}return p.l<q.l;}bool cmpi(ryl p,ryl q){return p.i<q.i;}void add(int pos,int x){if(x==-1)v[pos]=0;else v[pos]=1;if(!ct[col[pos]])ans++;ct[col[pos]]+=x;if(!ct[col[pos]])ans--;}int main(){n=ryll();m=ryll();jl=pow(n,2.0/3);for(int i=1;i<=n;i++){pre[i]=col[i]=ryll();pos[i]=(i-1)/jl+1;}for(int i=1;i<=m;i++){char c;cin>>c;int x=ryll(),y=ryll();if(c=='Q'){if(x>y)swap(x,y);cnt1++;a[cnt1].l=x;a[cnt1].r=y;a[cnt1].i=cnt1;a[cnt1].ti=cnt2;}else {cnt2++;b[cnt2].pos=x;b[cnt2].col=y;b[cnt2].pre=pre[x];pre[x]=y;}}sort(a+1,a+cnt1+1,cmp);a[0].ti=0;int l=1,r=0;for(int i=1;i<=cnt1;i++){for(int j=a[i-1].ti+1;j<=a[i].ti;j++){if(v[b[j].pos]){add(b[j].pos,-1);col[b[j].pos]=b[j].col;add(b[j].pos,1);}col[b[j].pos]=b[j].col;}for(int j=a[i-1].ti;j>a[i].ti;j--){if(v[b[j].pos]){add(b[j].pos,-1);col[b[j].pos]=b[j].pre;add(b[j].pos,1);}col[b[j].pos]=b[j].pre;} while(r>a[i].r){add(r--,-1);}while(r<a[i].r){add(++r,1);}while(l>a[i].l){add(--l,1);}while(l<a[i].l){add(l++,-1);}a[i].a=ans;}sort(a+1,a+cnt1+1,cmpi);for(int i=1;i<=cnt1;i++){printf("%d\n",a[i].a);}return 0;}


0 0
原创粉丝点击