• BZOJ3524[Poi2014]Couriers——主席树


    题目描述

    给一个长度为n的序列a。1≤a[i]≤n。
    m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2。如果存在,输出这个数,否则输出0。

    输入

    第一行两个数n,m。
    第二行n个数,a[i]。
    接下来m行,每行两个数l,r,表示询问[l,r]这个区间。

    输出

    m行,每行对应一个答案。

    样例输入

    7 5
    1 1 3 2 3 4 3
    1 3
    1 4
    3 7
    1 7
    6 6

    样例输出

    1
    0
    3
    0
    4

    提示

    【数据范围】

    n,m≤500000

      因为出现次数具有可减性,所以用主席树维护区间出现的数的总次数,建立权值线段树每次询问时用r时刻线段树减l-1时刻线段树,找区间总次数>(r-l+1)>>1的子区间递归下去。

    #include<map>
    #include<set>
    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define mid (L+R)/2
    using namespace std;
    int n,m;
    int x,y;
    int cnt;
    int ans;
    int l[10000010];
    int r[10000010];
    int sum[10000010];
    int root[10000010];
    int updata(int pre,int L,int R,int k)
    {
        int rt=++cnt;
        l[rt]=l[pre];
        r[rt]=r[pre];
        sum[rt]=sum[pre]+1;
        if(L==R)
        {
            return rt;
        }
        if(k<=mid)
        {
            l[rt]=updata(l[pre],L,mid,k);
        }
        else
        {
            r[rt]=updata(r[pre],mid+1,R,k);
        }
        return rt;
    }
    int query(int rr,int ll,int L,int R,int k)
    {
        if(L==R)
        {
            return L;
        }
        int x=sum[l[rr]]-sum[l[ll]];
        int y=sum[r[rr]]-sum[r[ll]];
        if(x>k)
        {
            return query(l[rr],l[ll],L,mid,k);
        }
        else if(y>k)
        {
            return query(r[rr],r[ll],mid+1,R,k);
        }
        else
        {
            return 0;
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            root[i]=updata(root[i-1],1,n,x);
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%d
    ",query(root[y],root[x-1],1,n,(y-x+1)/2));
        }
    }
    
  • 相关阅读:
    Linux常用命令大全
    Shell常用命令整理
    登录织梦后台提示用户名不存在的解决方法介绍
    dedecms系统后台登陆提示用户名密码不存在
    dede被注入后台提示用户名不存在解决方法
    织梦dedecmsV5.7联动类型无法显示的处理方法
    漏洞安全防范
    Sublime 安装、插件CoolFormat
    如何查看sublime安装了哪些插件
    本地如何使用phpstudy环境搭建多站点
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/9298450.html
Copyright © 2020-2023  润新知