码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2104 K-th Number

时间:2016-10-07 13:39:57      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

主席树+离散化

因为主席树空间开小了RE了两次,呜呜呜

一定要注意空间大小

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<vector>
 4 using namespace std;
 5 const int Nmax=1e5+6;
 6 int n,m;
 7 int cnt,root[Nmax],num[Nmax];
 8 int x,y,k;
 9 struct Node
10 {
11     int l;
12     int r;
13     int sum;
14 }; 
15 Node tree[Nmax*40];
16 vector<int> v;
17 int getid(int x)
18 {
19     return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
20 }
21 
22 void update(int l,int r, int &x,int y,int pos)
23 {
24     tree[++cnt]=tree[y];
25     tree[cnt].sum++;
26     x=cnt;
27     if(l==r)
28         return;
29     int mid=(l+r)>>1;
30     if(mid>=pos)
31         update(l,mid,tree[x].l,tree[y].l,pos);
32     else
33         update(mid+1,r,tree[x].r,tree[y].r,pos);
34 }
35 
36 int query(int l,int r,int x,int y,int k)
37 {
38     if(l==r)
39         return l;
40     int mid=(l+r)>>1;
41     int sum=tree[tree[y].l].sum-tree[tree[x].l].sum;
42     if(sum>=k)
43         return query(l,mid,tree[x].l,tree[y].l,k);
44     else
45         return query(mid+1,r,tree[x].r,tree[y].r,k-sum);
46 }
47 
48 int main()
49 {
50     scanf("%d%d",&n,&m);
51     for(int i=1;i<=n;i++)
52     {
53         scanf("%d",&num[i]);
54         v.push_back(num[i]);
55     }
56     sort(v.begin(),v.end());
57     v.erase(unique( v.begin(),v.end() ),v.end() );
58     for(int i=1;i<=n;i++)
59         update(1,n,root[i],root[i-1],getid(num[i]));
60     for(int i=1;i<=m;i++)
61     {
62         scanf("%d%d%d",&x,&y,&k);
63         printf("%d\n",v[query(1,n,root[x-1],root[y],k)-1]);
64     }
65     return 0;
66 }

 

POJ 2104 K-th Number

标签:

原文地址:http://www.cnblogs.com/BBBob/p/5935737.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!