社区讨论

小萌新求助CDQ分治(悬赏关注)

P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo7m2ac6
此快照首次捕获于
2023/10/27 04:02
2 年前
此快照最后确认于
2023/10/27 04:02
2 年前
查看原帖
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 2919810
#define int long long
using namespace std;
int n,m,tot,col[N];
struct node{
	int t,x,y,typ,a;
	bool operator <(const node &fifi)const{return t<fifi.t;}
}q[N],tmp[N];
int w=1e6;
struct bit{
	int t[N];
	void clear(){memset(t,0,sizeof(t));}
	int lowbit(int x){return x&-x;}
	void add(int x,int v){for(;x<=w;x+=lowbit(x))t[x]+=v;}
	int query(int x){
		int ans=0;
		for(;x;x-=lowbit(x))ans+=t[x]?1:0;
		return ans;
	}
	void assign(int x,int v){for(;x<=w;x+=lowbit(x))t[x]=v;}
}b; 
void cdq(int l,int r){
	if(l==r)return;
	int mid=(l+r)/2;
	cdq(l,mid);cdq(mid+1,r);
	int i=l,j=mid+1,k=l;
	while(i<=mid&&j<=r){
		if(q[i].x<=q[j].x){
			if(q[i].typ==1)b.add(q[i].y,q[i].a);
		//	printf("test:%lld %lld %lld %lld %lld \n",q[i].t,q[i].x,q[i].y,q[i].typ,q[i].a);
			tmp[k++]=q[i++];
		}else{
			if(q[j].typ==2)q[j].a+=b.query(q[j].y);
		//	printf("test:%lld %lld %lld %lld %lld \n",q[j].t,q[j].x,q[j].y,q[j].typ,q[j].a);
			tmp[k++]=q[j++];
		}
	}
	while(i<=mid){
		if(q[i].typ==1)b.add(q[i].y,q[i].a);
	//	printf("test:%lld %lld %lld %lld %lld \n",q[i].t,q[i].x,q[i].y,q[i].typ,q[i].a);
		tmp[k++]=q[i++];
	}
	while(j<=r){
		if(q[j].typ==2)q[j].a+=b.query(q[j].y);
	//	printf("test:%lld %lld %lld %lld %lld \n",q[j].t,q[j].x,q[j].y,q[j].typ,q[j].a);
		tmp[k++]=q[j++];
	}
	
	for(int i=l;i<=mid;i++)if(q[i].typ==1)b.assign(q[i].y,0);
	for(int i=l;i<=r;i++)q[i]=tmp[i];
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		int a;
		scanf("%lld",&a);
		col[i]=a;
		q[++tot]={tot,i,a,1,1};
	}
	while(m--){
		char s[10];
		int x,y;
		scanf("%s%lld%lld",s,&x,&y);
		if(s[0]=='Q'){
			q[++tot]={tot,y,w,2,0};
			q[++tot]={tot,x-1,w,2,0};
		}else if(s[0]=='R'){
			q[++tot]={tot,x,col[x],1,-1};
			q[++tot]={tot,x,y,1,1};
			col[x]=y;
		}
	}
	//sort(q+1,q+tot+1);
	cdq(1,tot);
	sort(q+1,q+tot+1);
	for(int i=1;i<=tot;i++){
	//	printf("test:%lld %lld %lld %lld %lld \n",q[i].t,q[i].x,q[i].y,q[i].typ,q[i].a);
		if(q[i].typ==2){
			printf("%lld\n",q[i].a-q[i+1].a);
			i++;
		}
	}
	return 0;
}


回复

2 条回复,欢迎继续交流。

正在加载回复...