bzoj2223 [Coci 2009]PATULJCI (模板)(主席树)

Posted Sinogi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2223 [Coci 2009]PATULJCI (模板)(主席树)相关的知识,希望对你有一定的参考价值。

2223: [Coci 2009]PATULJCI

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1245  Solved: 530
[Submit][Status][Discuss]

Description

技术分享

HINT

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

 

 

主席树模板dearu;

蒟蒻只能码板子了啊(摊);

 

↓代码

技术分享
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<cmath>
  6 #include<algorithm>
  7 #include<vector>
  8 #include<queue>
  9 #include<map>
 10 #define N 300039
 11 #define inf 0x3f3f3f3f
 12 #define ll long long 
 13 using namespace std;
 14 struct number
 15 {
 16     int n,r;
 17 }num[N];
 18 struct seg
 19 {
 20     int ls,rs,cnt;
 21 }tree[N<<4];
 22 int val[N],tot,root[N];
 23 bool cmpn(number a,number b)
 24 {
 25     return a.n==b.n ? a.r<b.r : a.n<b.n;
 26 }
 27 bool cmpr(number a,number b)
 28 {
 29     return a.r<b.r;
 30 }
 31 void build(int k,int l,int r)
 32 {
 33     tree[k].cnt=0;
 34     if(l==r)
 35     {
 36         return;
 37     }
 38     int mid=(l+r)>>1;
 39     build(tree[k].ls=++tot,l,mid);
 40     build(tree[k].rs=++tot,mid+1,r);
 41 }
 42 void update(int las,int now,int l,int r,int v)
 43 {
 44     if(l==r)
 45     {
 46         tree[now].cnt=tree[las].cnt+1;
 47         return;
 48     }
 49     int mid=(l+r)>>1;
 50     if(mid>=v)
 51     {
 52         tree[now].rs=tree[las].rs;
 53         update(tree[las].ls,tree[now].ls=++tot,l,mid,v);
 54     }
 55     else
 56     {
 57         tree[now].ls=tree[las].ls;
 58         update(tree[las].rs,tree[now].rs=++tot,mid+1,r,v);
 59     }
 60     tree[now].cnt+=tree[tree[now].ls].cnt+tree[tree[now].rs].cnt;
 61 }
 62 int query(int las,int now,int k,int l,int r)
 63 {
 64     if(l==r)
 65     {
 66         return l;
 67     }
 68     int mid=(l+r)>>1;
 69     if(tree[tree[now].ls].cnt-tree[tree[las].ls].cnt>k)
 70     {
 71         return query(tree[las].ls,tree[now].ls,k,l,mid);
 72     }
 73     else if(tree[tree[now].rs].cnt-tree[tree[las].rs].cnt>k)
 74     {
 75         return query(tree[las].rs,tree[now].rs,k,mid+1,r);
 76     }
 77     else
 78     {
 79         return -1;
 80     }
 81 }
 82 int main()
 83 {
 84     int n,m,lim,a,b,c;
 85     scanf("%d%d",&n,&lim);
 86     build(root[0]=++tot,1,lim);
 87     for(a=1;a<=n;a++)
 88     {
 89         scanf("%d",&b);
 90         update(root[a-1],root[a]=++tot,1,lim,b);
 91     }
 92     scanf("%d",&m);
 93     while(m--)
 94     {
 95         scanf("%d%d",&a,&b);
 96         c=query(root[a-1],root[b],(b-a+1)/2,1,lim);
 97         if(c==-1)
 98         {
 99             printf("no\n");
100         }
101         else
102         {
103             printf("yes %d\n",c);
104         }
105     }
106     return 0;
107 }
bzoj2223

 

以上是关于bzoj2223 [Coci 2009]PATULJCI (模板)(主席树)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ_2223_[Coci 2009]PATULJCI_主席树

BZOJ2223:[Coci2009]PATULJCI——题解

bzoj2223: [Coci 2009]PATULJCI

bzoj3524 [Poi2014]Couriers/2223 [Coci 2009]PATULJCI

BZOJ 2223 [Coci 2009]PATULJCI | 主席树练习 (好像是个权限题啊)

BZOJ-2223PATULJCI 可持久化线段树