[主席树] BZOJ 3524 [Poi2014]Couriers BZOJ 2223 [Coci 2009]PATULJCI

来源:互联网 发布:dnf赌马知乎 编辑:程序博客网 时间:2024/06/06 00:14

题目大意:区间众数[出现次数大于一半]


裸题

3524的代码


#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=10005;int n,m;int root[N],ls[21*N],rs[21*N],sum[21*N];int ncnt;void Build(int &x,int l,int r){x=++ncnt; if (l==r) return; int mid=(l+r)>>1;Build(ls[x],l,mid); Build(rs[x],mid+1,r);}void Modify(int &y,int x,int l,int r,int t){y=++ncnt; int mid=(l+r)>>1;if (l==r){sum[y]=sum[x]+1; return;}if (t<=mid) rs[y]=rs[x],Modify(ls[y],ls[x],l,mid,t),sum[y]=sum[ls[y]]+sum[rs[y]];elsels[y]=ls[x],Modify(rs[y],rs[x],mid+1,r,t),sum[y]=sum[ls[y]]+sum[rs[y]];}inline int Query(int x,int y){ int l=1,r=m,tmp=(y-x)>>1,mid;y=root[y],x=root[x];while (l!=r){mid=(l+r)>>1;if (sum[y]-sum[x]<=tmp) return 0;if (sum[ls[y]]-sum[ls[x]]>tmp) y=ls[y],x=ls[x],r=mid;else if (sum[rs[y]]-sum[rs[x]]>tmp) y=rs[y],x=rs[x],l=mid+1;elsereturn 0;}return r;}int main(){int Q,a,l,r;freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n); read(m);Build(root[0],1,m);for (int i=1;i<=n;i++) read(a),Modify(root[i],root[i-1],1,m,a);read(Q);while (Q--){read(l); read(r);int ret=Query(l-1,r);ret?printf("yes %d\n",ret):printf("no\n");}return 0;}


0 0
原创粉丝点击