版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MrTinTin/article/details/83339156
题目描述
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:
1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。
2、 R P Col 把第P支画笔替换为颜色Col。
为了满足墨墨的要求,你知道你需要干什么了吗?
输入输出格式
输入格式:
第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。
第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。
第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。
输出格式:
对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。
输入输出样例
输入样例#1: 复制
6 5 1 2 3 4 5 5 Q 1 4 Q 2 6 R 1 2 Q 1 4 Q 2 6
输出样例#1: 复制
4 4 3 4
说明
对于100%的数据,N≤50000,M≤50000,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
本题可能轻微卡常数
来源:bzoj2120
本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。
#include<bits/stdc++.h>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MAXN=5000000;
int n,m;
int Base,qnum,cnum;
int a[MAXN],Bel[MAXN];
int lcur=1,rcur,cur;
int ans[MAXN],res;
int num[MAXN];
struct Que{
int l,r,pre,id;
}q[MAXN];
struct Cha{
int pos,w;
}c[MAXN];
string s;
bool cmp(Que a,Que b)
{
if(Bel[a.l]==Bel[b.l]&&Bel[a.r]==Bel[b.r]) return a.pre<b.pre;
if(Bel[a.l]==Bel[b.l]) return a.r<b.r;
return a.l<b.l;
}
void add(int pos)
{
if(++num[a[pos]]==1) res++;
}
void del(int pos)
{
if(--num[a[pos]]==0) res--;
}
inline void work(int cpos,int qpos)
{
if(c[cpos].pos>=q[qpos].l&&c[cpos].pos<=q[qpos].r){
if(--num[a[c[cpos].pos]]==0) res--;
if(++num[c[cpos].w]==1) res++;
}
swap(a[c[cpos].pos],c[cpos].w);
}
int main()
{
ios::sync_with_stdio(false);
int i,j;
cin>>n>>m;
Base=sqrt(n);
f(i,1,n){
cin>>a[i];
Bel[i]=(i-1)/Base+1;
}
f(i,1,m){
cin>>s;
if(s=="Q"){
qnum++;
cin>>q[qnum].l>>q[qnum].r;
q[qnum].id=qnum;
q[qnum].pre=cnum;
// cout<<q[qnum].l<<" "<<q[qnum].r<<"GG"<<endl;
}
else{
cnum++;
cin>>c[cnum].pos>>c[cnum].w;
}
}
// f(i,1,qnum) cout<<q[i].l<<" "<<q[i].r<<endl;
sort(q+1,q+1+qnum,cmp);
f(i,1,qnum){
while(lcur<q[i].l) del(lcur++);
while(lcur>q[i].l) add(--lcur);
while(rcur<q[i].r) add(++rcur);
while(rcur>q[i].r) del(rcur--);
while(cur<q[i].pre) work(++cur,i);
while(cur>q[i].pre) work(cur--,i);
ans[q[i].id]=res;
// cout<<q[i].id<<" "<<q[i].l<<" "<<q[i].r<<" "<<res<<"GGG"<<endl;
}
f(i,1,qnum){
cout<<ans[i]<<endl;
}
return 0;
}