社区讨论
关于回滚莫队的撤销操作
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 条回复,欢迎继续交流。
正在加载回复...