zoukankan      html  css  js  c++  java
  • BZOJ 3524 [POI2014]KUR-Couriers (主席树)

     题目大意:给你一个序列,求某个区间出现次数大于一半的数是什么

    主席树裸题,刷刷水题提升自信= =

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #define ll long long 
     5 #define il inline
     6 #define N 500100
     7 using namespace std;
     8 //re
     9 int n,m,tot;
    10 int a[N],root[N];
    11 struct Seg{
    12     int ls,rs,sum;
    13 }seg[N*30];
    14 
    15 int gc()
    16 {
    17     int rett=0,fh=1;char p=getchar();
    18     while(p<'0'||p>'9'){if(p=='-')fh=-1;p=getchar();}
    19     while(p>='0'&&p<='9'){rett=(rett<<3)+(rett<<1)+p-'0';p=getchar();}
    20     return rett*fh;
    21 }
    22 il void pushup(int rt){seg[rt].sum=seg[seg[rt].ls].sum+seg[seg[rt].rs].sum;}
    23 void build(int l,int r,int rt)
    24 {
    25     if(l==r) return;
    26     int mid=(l+r)>>1;
    27     seg[rt].ls=++tot,build(l,mid,tot);
    28     seg[rt].rs=++tot,build(mid+1,r,tot);
    29 }
    30 void update(int x,int l,int r,int rt1,int rt2,int val)
    31 {
    32     if(l==r) {seg[rt2].sum+=val;return;}
    33     int mid=(l+r)>>1;
    34     if(x<=mid){
    35         if(!seg[rt2].ls||seg[rt2].ls==seg[rt1].ls){
    36             seg[rt2].ls=++tot,seg[seg[rt2].ls].sum=seg[seg[rt1].ls].sum;
    37             if(!seg[rt2].rs) seg[rt2].rs=seg[rt1].rs;
    38         }update(x,l,mid,seg[rt1].ls,seg[rt2].ls,val);
    39     }else{
    40         if(!seg[rt2].rs||seg[rt2].rs==seg[rt1].rs){
    41             seg[rt2].rs=++tot,seg[seg[rt2].rs].sum=seg[seg[rt1].rs].sum;
    42             if(!seg[rt2].ls) seg[rt2].ls=seg[rt1].ls;
    43         }update(x,mid+1,r,seg[rt1].rs,seg[rt2].rs,val);
    44     }pushup(rt2);
    45 }
    46 int query(int l,int r,int rt1,int rt2,int len)
    47 {
    48     if(l==r) return l;
    49     int mid=(l+r)>>1;
    50     if(seg[seg[rt2].ls].sum-seg[seg[rt1].ls].sum>=len) 
    51         return query(l,mid,seg[rt1].ls,seg[rt2].ls,len);
    52     if(seg[seg[rt2].rs].sum-seg[seg[rt1].rs].sum>=len) 
    53         return query(mid+1,r,seg[rt1].rs,seg[rt2].rs,len);
    54     return 0;
    55 }
    56 
    57 int main()
    58 {
    59     //freopen("data.in","r",stdin);
    60     scanf("%d%d",&n,&m);
    61     for(int i=1;i<=n;i++) a[i]=gc();
    62     root[0]=++tot,build(1,n,tot);
    63     for(int i=1;i<=n;i++)
    64         root[i]=++tot,update(a[i],1,n,root[i-1],root[i],1);
    65     int x,y;
    66     while(m--)
    67     {
    68         x=gc(),y=gc();
    69         printf("%d
    ",query(1,n,root[x-1],root[y],(y-x+1)/2+1));
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    Mina之session
    进程管理
    Mina之polling
    用户和组ID
    Mina之service
    同步化、同步及异步操作
    高级进程管理
    一般文件I/O用法建议
    有一个图像搜索引擎
    图像处理和识别和机器学习源码
  • 原文地址:https://www.cnblogs.com/guapisolo/p/9697043.html
Copyright © 2011-2022 走看看