P3901 数列找不同
Posted hahaha2124652975
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3901 数列找不同相关的知识,希望对你有一定的参考价值。
莫队
#include<iostream> #include<cmath> #include<algorithm> #include<cstdio> using namespace std; const int N=100006; int n,m,l,r,nu,q; int ar[N],num[N],ans[N]; struct node int x,y,z; a[N]; int get() char zy=getchar(); int z=1,y=0; while(zy>‘9‘||zy<‘0‘) if(zy==‘-‘)z=-1; zy=getchar(); while(zy>=‘0‘&&zy<=‘9‘) y=y*10+zy-‘0‘; zy=getchar(); return z*y; bool cmp(node a,node b) return (a.x/q)==(b.x/q)?a.y<b.y:(a.x/q)<(b.x/q); void add(int p) num[ar[p]]++; if(num[ar[p]]==2)nu++; void del(int p) num[ar[p]]--; if(num[ar[p]]==1)nu--; int main() n=get();m=get(); q=sqrt(n); for(int i=1;i<=n;i++) ar[i]=get(); for(int i=1;i<=m;i++) a[i].x=get(); a[i].y=get(); a[i].z=i; sort(a+1,a+1+m,cmp); for(int i=1;i<=m;i++) while(r<a[i].y)add(++r); while(l>a[i].x)add(--l); while(r>a[i].y)del(r--); while(l<a[i].x)del(l++); if(!nu) ans[a[i].z]=1; for(int i=1;i<=m;i++) if(ans[i]) printf("Yes\n"); else printf("No\n"); return 0;
以上是关于P3901 数列找不同的主要内容,如果未能解决你的问题,请参考以下文章