zoukankan      html  css  js  c++  java
  • Bzoj 3524: [Poi2014]Couriers(主席树)

    3524: [Poi2014]Couriers
    Time Limit: 20 Sec Memory Limit: 256 MB
    Description
    给一个长度为n的序列a。1≤a[i]≤n。
    m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。
    Input
    第一行两个数n,m。
    第二行n个数,a[i]。
    接下来m行,每行两个数l,r,表示询问[l,r]这个区间。
    Output
    m行,每行对应一个答案。
    Sample Input
    7 5
    1 1 3 2 3 4 3
    1 3
    1 4
    3 7
    1 7
    6 6
    Sample Output
    1
    0
    3
    0
    4
    HINT
    【数据范围】
    n,m≤500000
    2016.7.9重设空间,但未重测!
    Source
    By Dzy

    /*
    这题比较水.
    1A.
    用主席树建权值线段树. 
    直接询问(y-x+1)/2+1小的数是谁.
    然后判断这个数出现的次数是否满足条件. 
    */
    #include<cstdio>
    #define MAXN 500001
    using namespace std;
    int n,m,cut,ans,root[MAXN];
    struct data{int lc,rc,size;}tree[MAXN*20];
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    void change(int &now,int last,int l,int r,int x)
    {
        now=++cut;tree[now].size=tree[last].size+1;
        tree[now].lc=tree[last].lc,tree[now].rc=tree[last].rc;
        if(l==r) return ;
        int mid=(l+r)>>1;
        if(x<=mid) change(tree[now].lc,tree[last].lc,l,mid,x);
        else change(tree[now].rc,tree[last].rc,mid+1,r,x);
        return ;
    }
    int query(int x,int y,int l,int r,int k,int z)
    {
        int p=tree[tree[y].lc].size-tree[tree[x].lc].size;
        if(l==r) {
            if(tree[y].size-tree[x].size>=z) return l;
            else return 0;
        }
        int mid=(l+r)>>1;
        if(p>=k) return query(tree[x].lc,tree[y].lc,l,mid,k,z);
        else return query(tree[x].rc,tree[y].rc,mid+1,r,k-p,z);
    }
    int main()
    {
        int x,y,k;
        n=read(),m=read();
        for(int i=1;i<=n;i++) x=read(),change(root[i],root[i-1],1,n,x); 
        while(m--)
        {
            x=read(),y=read();
            k=(y-x+1)/2+1;
            printf("%d
    ",query(root[x-1],root[y],1,n,k,k));
        }
        return 0;
    }
  • 相关阅读:
    BAT脚本编写要点(1)_特殊字符
    开源爬虫软件汇总
    使用Gradle发布项目到JCenter仓库
    解决Android中,禁止ScrollView内的控件改变之后自动滚动
    理解RESTful架构
    一种为 Apk 动态写入信息的方案
    Proguard配置注解
    使用statsvn统计svn中的代码量
    android如何释放图片缓存
    Git命令参考手册(文本版)
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068115.html
Copyright © 2011-2022 走看看