SP20644 ZQUERY - Zero Query

题目

SP20644 ZQUERY - Zero Query

分析

回滚莫队模板题。

询问一个区间和为 0 显然可以想到前缀和,就直接可以转化成判断两点相等了。

然后就是模板题了,和模板题的唯一区别是这里要做一个前缀和,然后注意询问的左端点要 \(-1\)

代码

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
	x=0;char ch=getchar();bool f=false;
	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template <typename T>
inline void write(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=2e5+5;
#define ll long long
int n,m,k,a[N];
int Ans[N],st[N],ed[N],b[N],cl,clear[N],bl[N],block,blo;
struct Query{
	int l,r,id;
	Query(int l=0,int r=0,int id=0):l(l),r(r),id(id){}
	inline bool operator < (const Query &B)const{return bl[l]!=bl[B.l]?bl[l]<bl[B.l]:r<B.r;}
}Q[N];
int las[N];
int Calc(int l,int r){
	int res=0;
	for(int i=l-1;i<=r;i++) las[a[i]]=0;
	for(int i=l-1;i<=r;i++) if(las[a[i]]) res=max(res,i-las[a[i]]); else las[a[i]]=i;
	return res;
}
int main(){
	read(n);read(m);
	const int t=sqrt(n);a[0]=5e4;
	for(int i=1;i<=n;i++) read(a[i]),a[i]+=a[i-1],b[i]=a[i],bl[i]=(i-1)/t+1;
	blo=bl[n];
//	sort(b+1,b+n+1);
//	int Id=unique(b+1,b+n+1)-b-1;
//	for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+Id+1,a[i])-b;
	for(int i=1;i<=m;i++){
		int l,r;read(l),read(r);
		Q[i]=Query(l,r,i);
	}
	sort(Q+1,Q+m+1);
	for(int i=1,j=1;j<=blo;j++){
		int R=min(j*t,n),l=R+1,r=R,now=0;cl=0;
		for(;bl[Q[i].l]==j;i++){
			if(bl[Q[i].r]==j){
				Ans[Q[i].id]=Calc(Q[i].l,Q[i].r);
				continue;
			}
			while(r<Q[i].r){
				r++;
				ed[a[r]]=r;
				if(!st[a[r]]) st[a[r]]=r,clear[++cl]=a[r];
				else now=max(now,r-st[a[r]]);
			}
			int tmp=now;
			while(l>=Q[i].l){
				l--;
				if(!ed[a[l]]) ed[a[l]]=l;
				else now=max(now,ed[a[l]]-l);
			}
			Ans[Q[i].id]=now;
			while(l<=R){
				if(ed[a[l]]==l) ed[a[l]]=0;
				l++;
			}
			now=tmp;
		} 
		for(int k=1;k<=cl;k++) st[clear[k]]=ed[clear[k]]=0;
	}
	for(int i=1;i<=m;i++) write(Ans[i]),putchar('\n');
	return 0;
} 
posted @ 2021-04-27 12:11  __Anchor  阅读(40)  评论(0编辑  收藏  举报