#带修莫队# [luogu P1903] [国家集训队]数颜色 / 维护队列

Title

P1903 [国家集训队]数颜色 / 维护队列


Solution

注意cnt数组要开大,然后q[i].id=cntq而不是i!!!
带修莫队就是在普通莫队上加上一维时间轴。
不太会证明块的大小与莫队时间复杂度的影响,这道题似乎要将块的大小设置为 n 2 3 n^{\frac{2}{3}} n32会比较优秀


Code

#include<cstdio> 
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std; 
const int N=2e5+5,M=1e6+5; 
int read(){
	int p=0; char c=getchar(); 
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar(); 
	return p; 
}
char s[101]; 
int n,m,size,cnt[M],ans[N],val,a[N],cntq,cntr,b[N],t;
struct node{
	int l,r,t,id; 
}q[N];
struct node2{
	int l,r; 
}c[N];
bool cmp(node x,node y){
	return (b[x.l]^b[y.l])?b[x.l]<b[y.l]:((b[x.r]^b[y.r])?b[x.r]<b[y.r]:x.t<y.t); 
}
int main(){
	n=read(),m=read(); 
	size=(int)pow(n,2.0/3.0); 
	rep(i,1,n) b[i]=(i-1)/size+1; 
	rep(i,1,n) a[i]=read(); 
	rep(i,1,m){
		scanf("%s",s); 
		if (s[0]=='Q') q[++cntq].l=read(),q[cntq].r=read(),q[cntq].id=cntq,q[cntq].t=cntr; 
		else if (s[0]=='R') c[++cntr].l=read(),c[cntr].r=read(); 
	}
	sort(q+1,q+cntq+1,cmp); 
	int l=1,r=0; 
	rep(i,1,cntq){
		int ql=q[i].l,qr=q[i].r,qt=q[i].t; 
		while (l>ql) val+=!cnt[a[--l]]++; 
		while (r<qr) val+=!cnt[a[++r]]++; 
		while (l<ql) val-=!--cnt[a[l++]]; 
		while (r>qr) val-=!--cnt[a[r--]]; 
		while (t<qt){
			++t; 
			if (ql<=c[t].l&&c[t].l<=qr) val-=!--cnt[a[c[t].l]]-!cnt[c[t].r]++;  
			swap(a[c[t].l],c[t].r); 
		}
		while (t>qt){
			if (ql<=c[t].l&&c[t].l<=qr) val-=!--cnt[a[c[t].l]]-!cnt[c[t].r]++; 
			swap(a[c[t].l],c[t].r); 
			--t; 
		}
		ans[q[i].id]=val; 
	}
	rep(i,1,cntq) printf("%d\n",ans[i]); 
	return 0; 
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值