bzoj2223 [Coci 2009]PATULJCI (主席树)

2223: [Coci 2009]PATULJCI

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 1253  Solved: 533
[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 seg
15 {
16     int ls,rs,cnt;
17 }tree[N<<4];
18 int val[N],tot,root[N];
19 void build(int k,int l,int r)
20 {
21     tree[k].cnt=0;
22     if(l==r)
23     {
24         return;
25     }
26     int mid=(l+r)>>1;
27     build(tree[k].ls=++tot,l,mid);
28     build(tree[k].rs=++tot,mid+1,r);
29 }
30 void update(int las,int now,int l,int r,int v)
31 {
32     if(l==r)
33     {
34         tree[now].cnt=tree[las].cnt+1;
35         return;
36     }
37     int mid=(l+r)>>1;
38     if(mid>=v)
39     {
40         tree[now].rs=tree[las].rs;
41         update(tree[las].ls,tree[now].ls=++tot,l,mid,v);
42     }
43     else
44     {
45         tree[now].ls=tree[las].ls;
46         update(tree[las].rs,tree[now].rs=++tot,mid+1,r,v);
47     }
48     tree[now].cnt=tree[tree[now].ls].cnt+tree[tree[now].rs].cnt;
49 }
50 int query(int las,int now,int k,int l,int r)
51 {
52     if(l==r)
53     {
54         return l;
55     }
56     int mid=(l+r)>>1;
57     if(tree[tree[now].ls].cnt-tree[tree[las].ls].cnt>k)
58     {
59         return query(tree[las].ls,tree[now].ls,k,l,mid);
60     }
61     else if(tree[tree[now].rs].cnt-tree[tree[las].rs].cnt>k)
62     {
63         return query(tree[las].rs,tree[now].rs,k,mid+1,r);
64     }
65     else
66     {
67         return -1;
68     }
69 }
70 int main()
71 {
72     int n,m,lim,a,b,c;
73     scanf("%d%d",&n,&lim);
74     build(root[0]=++tot,1,lim);
75     for(a=1;a<=n;a++)
76     {
77         scanf("%d",&b);
78         update(root[a-1],root[a]=++tot,1,lim,b);
79     }
80     scanf("%d",&m);
81     while(m--)
82     {
83         scanf("%d%d",&a,&b);
84         c=query(root[a-1],root[b],(b-a+1)/2,1,lim);
85         if(c==-1)
86         {
87             printf("no\n");
88         }
89         else
90         {
91             printf("yes %d\n",c);
92         }
93     }
94     return 0;
95 }
bzoj2223 mogical tree

 

posted @ 2017-09-12 20:03  Sinogi  阅读(228)  评论(0编辑  收藏  举报