社区讨论

关于回滚莫队的撤销操作

P5906【模板】回滚莫队&不删除莫队参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo2pievc
此快照首次捕获于
2023/10/23 17:40
2 年前
此快照最后确认于
2023/10/23 17:40
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
constexpr int N(200010),M(500);
constexpr int INF(1<<30);
inline int read(){
	int x(0),f(1);char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
	return x*f;
}
void print(int x) {if(x>9)print(x/10);putchar(x%10+48);}
int n,m;
int pos[N],L[M],R[M],t,sz;
int a[N],b[N],recl[N],recr[N],ed[N],tprec[N];
int ans[N],tpMax,Max,tpans;
int cl[N],cnt;
inline void build(){
	sz=sqrt(n),t=n/sz;
	for(int i=1;i<=t;++i) L[i]=(i-1)*sz+1,R[i]=i*sz;
	if(R[t]<n) {t++;L[t]=R[t-1]+1;R[t]=n;}
	for(int i=1;i<=t;++i) for(int j=L[i];j<=R[i];++j) pos[j]=i;
}
inline void discrete(){
	sort(b+1,b+1+n);int k=unique(b+1,b+1+n)-(b+1);
	for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+k,a[i])-b;
}
struct Mo{
	int l,r,id;
	bool operator<(const Mo &x)const{return pos[l]^pos[x.l]?l<x.l:r<x.r;}
}q[N];
int main(){
	n=read();for(int i=1;i<=n;++i) a[i]=b[i]=read();  discrete();build();
	m=read();for(int i=1;i<=m;++i) q[i]=(Mo){read(),read(),i};  sort(q+1,q+1+m);
	for(int i=1,l=1,r=0,tpl=1,last_block=0;i<=m;++i){
		const Mo &x=q[i];
		if(pos[x.l]==pos[x.r]){
			for(int j=x.l;j<=x.r;++j) 
			if(!tprec[a[j]])tprec[a[j]]=j;
			else ans[x.id]=max(ans[x.id],j-tprec[a[j]]);
			for(int j=x.l;j<=x.r;++j) tprec[a[j]]=0;
			continue;
		}
		if(pos[x.l]!=last_block){
/*     
	Wrong Answer:			
		while(r>R[pos[x.l]])   {recl[a[r]]=recr[a[r]]=0,r--;} 
		while(l<R[pos[x.l]]+1) {recl[a[l]]=recr[a[l]]=0,l++;} 
*/
 
/* 
	Accepted:
		for(int j=l;j<=r;++j) recl[a[j]]=recr[a[j]]=0;
		l=R[pos[x.l]]+1,r=R[pos[x.l]];
*/	
		for(int j=l;j<=r;++j) recl[a[j]]=recr[a[j]]=0;
			l=R[pos[x.l]]+1,r=R[pos[x.l]];
			Max=0;	last_block=pos[x.l];
		}
		while(r<x.r){
			r++;recr[a[r]]=r;
			if(!recl[a[r]])recl[a[r]]=r;
			Max=max(Max,recr[a[r]]-recl[a[r]]);
		}tpl=l,tpMax=Max,cnt=0;
		while(tpl>x.l){
			tpl--;
			if(!ed[a[tpl]]) ed[a[tpl]]=tpl;
			tpMax=max(tpMax,max(recr[a[tpl]],ed[a[tpl]])-tpl);
		}ans[x.id]=tpMax;
		while(tpl<l){
			ed[a[tpl]]=0;
			tpl++;
		}
	}
	for(int i=1;i<=m;++i) print(ans[i]),putchar('\n');
	return 0;
}
此两种写法不明白有何差异,一个WA 16pts,一个AC

回复

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

正在加载回复...