前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bzoj 2120 数颜色 带修莫队

bzoj 2120 数颜色 带修莫队

作者头像
用户2965768
发布2019-07-08 17:59:49
3280
发布2019-07-08 17:59:49
举报
文章被收录于专栏:wymwym

题解:

代码语言:javascript
复制
// Q L R询问 L到R区间不同颜色数
// R P col 将R位置的颜色改为col 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1000005;//unit = n^(2/3)  O(n^(5/3))
struct Tim{int l,r,t,ID;}q[maxn];
struct Change{int pos,New,old;}c[maxn];
int n,m,l=1,r,Ans,unit,t,Time,T;
int s[maxn],color[maxn],Be[maxn],now[maxn],ans[maxn]; 
int cmp(Tim c,Tim d){
	return Be[c.l]==Be[d.l]?(Be[c.r]==Be[d.r]?c.t<d.t:c.r<d.r):c.l<d.l;
} 
void revise(int x,int d){//颜色x在区间值变化 d 指针移动 
	color[x]+=d; if(d>0)Ans+=(color[x]==1);if(d<0)Ans-=(color[x]==0); 
}
void going(int x,int d){//单点修改 x位置 变为 d  
	if(x<=r&&x>=l)revise(s[x],-1),revise(d,1);//l,r内改变,在l,r外下面while会改变 
	s[x] = d;
}
int main() {
	char op;
	int x,y;
	cin.tie(0);
	cin>>n>>m; unit = pow(n,0.6666);
	for(int i=1;i<=n;i++)cin>>s[i],now[i] = s[i],Be[i] = i/unit+1;
	for(int i=1;i<=m;i++){
		cin>>op>>x>>y;
		if(op=='Q')q[++t].l = x,q[t].r = y,q[t].t = Time,q[t].ID = t;//询问[x,y]区间不同颜色的笔有几只 
		if(op=='R')c[++Time].pos = x,c[Time].New = y,c[Time].old=now[x],now[x] = y;
		//Q是把第 x 只画笔颜色变为y 
	}
	sort(q+1,q+t+1,cmp);
	for(int i=1;i<=t;i++){
		while(T<q[i].t)going(c[T+1].pos,c[T+1].New),T++;//T代表现在的时间 
		while(T>q[i].t)going(c[T].pos,c[T].old),T--;
		
		while(l<q[i].l)revise(s[l],-1),l++;
		while(l>q[i].l)revise(s[l-1],1),l--;
		while(r<q[i].r)revise(s[r+1],1),r++;
		while(r>q[i].r)revise(s[r],-1),r--;
		ans[q[i].ID] = Ans;
	}
	for(int i=1;i<=t;i++){
		printf("%d\n",ans[i]);
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档