zoukankan      html  css  js  c++  java
  • BZOJ2223[Coci 2009]PATULJCI——主席树

    题目描述

    输入

     先输入一个数n,然后一个数表示这n个数中最大的是多少,接下来一行n个数。然后一个数m,最后m行询问每次两个数l,r。

    输出

    no或者yes+这个数

    样例输入

    10

    3

    1 2 1 2 1 2 3 2 3 3

    8

    1 2

    1 3

    1 4

    1 5

    2 5

    2 6

    6 9

    7 10

    样例输出

    no
    yes 1
    no
    yes 1
    no
    yes 2
    no
    yes 3

    提示

    Notice:输入第二个整数是序列中权值的范围Lim,即1<=ai(1<=i<=n)<=Lim。
    1<=Lim<=10000

      原题样例比较懵逼,这里解释了一下输入写在上面。

      这题算是主席树模板题了,维护n个时刻的主席树,每一时刻开一棵权值线段树维护区间数的个数,然后在主席树上二分查找。

    #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 lim;
    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,&lim);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            root[i]=updata(root[i-1],1,lim,x);
        }
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            int ans=query(root[y],root[x-1],1,lim,(y-x+1)/2);
            if(ans==0)
            {
                 
                printf("no
    ");
            }
            else
            {
                 
                printf("yes %d
    ",ans);
            }
        }
    }
     
    
  • 相关阅读:
    error: Microsoft Visual C++ 14.0 is required.
    pip安装其他包报错
    MapReduce
    机器学习算法使用
    结巴分词使用实例
    大数据——hbase
    机房收费系统系列一:运行时错误‘-2147217843(80040e4d)’;用户‘sa’登陆失败
    耿建玲视频总结
    学生信息管理系统系列三:验收时的改进
    学生信息管理系统系列二:常见问题
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/9473377.html
Copyright © 2011-2022 走看看