老瞎眼 pk 小鲜肉
老瞎眼 pk 小鲜肉
https://ac.nowcoder.com/acm/problem/50444
参考代码:
#include<bits/stdc++.h> #define read() Read<int>() namespace pb_ds{ namespace io{ const int MaxBuff=1<<15; const int Output=1<<23; char B[MaxBuff],*S=B,*T=B; #define getc() ((S==T)&&(T=(S=B)+fread(B,1,MaxBuff,stdin),S==T)?0:*S++) char Out[Output],*iter=Out; inline void flush(){ fwrite(Out,1,iter-Out,stdout); iter=Out; } } template<class Type> inline Type Read(){ using namespace io; register char ch; register Type ans=0; register bool neg=0; while(ch=getc(),(ch<'0' || ch>'9') && ch!='-'); ch=='-'?neg=1:ans=ch-'0'; while(ch=getc(),'0'<= ch && ch<='9') ans=ans*10+ch-'0'; return neg?-ans:ans; } template<class Type> inline void Print(register Type x,register char ch='\n'){ using namespace io; if(!x) *iter++='0'; else{ if(x<0) *iter++='-',x=-x; static int s[100]; register int t=0; while(x) s[++t]=x%10,x/=10; while(t) *iter++='0'+s[t--]; } *iter++=ch; } } using namespace pb_ds; using namespace std; typedef long long ll; const int N=5e5+5; const int M=(1<<20)+5; int n,q,pos; int las[M],s[N]; int pre[N],rk[N]; int ans[N]; inline bool cmp(int x,int y){ return pre[x]>pre[y]; } struct node{ int l,r,id; inline bool operator < (const node &u)const{ return l>u.l; } }a[N]; namespace bit{ #define lowbit(x) (x&(-x)) int sss[N]; inline void init(){ memset(sss,63,sizeof(sss)); } inline void add(int x,int k){ for (int i=x+1;i<=n+1;i+=lowbit(i)) sss[i]=min(sss[i],k); } inline int query(int x){ int res=n+1; for (int i=x+1;i;i-=lowbit(i)) res=min(sss[i],res); return res; } } using namespace bit; int main(){ //freopen("a.in","r",stdin); n=read(),q=read(); for (int i=1;i<=n;++i) s[i]=s[i-1]^read(); memset(pre,-1,sizeof(pre)); memset(las,-1,sizeof(las)); for (int i=0;i<=n;++i) pre[i]=las[s[i]],las[s[i]]=i,rk[i]=i; for (int i=1;i<=q;++i) a[i].l=read(),a[i].r=read(),a[i].id=i; sort(a+1,a+q+1),sort(rk,rk+n+1,cmp); init(); for (int i=1;i<=q;++i){ while (pos<=n && pre[rk[pos]]>=a[i].l-1) add(rk[pos],rk[pos]-pre[rk[pos]]),++pos; ans[a[i].id]=query(a[i].r); if (ans[a[i].id]>n) ans[a[i].id]=-1; } for (int i=1;i<=q;++i) printf("%d\n",ans[i]); return 0; }