• 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;
    }
  • 相关阅读:
    基础语法
    Python简介
    Linux安装Python
    Git安装和使用
    vue 表单验证省市县三联动
    js 异步问题
    Json对象与Json字符串互转(4种转换方式)
    vue 常用的表单验证,包括手机号码,固定电话和身份证...
    webpack 基本功能和原理
    测试build出来的dist文件夹是否编译成功
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068115.html
Copyright © 2020-2023  润新知