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

poj 2828 Buy Tickets【线段树 单点更新】

时间:2015-08-05 00:45:39      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

倒着插,先不理解意思,后来看一篇题解说模拟一下

手动模拟一下就好理解了-----

不过话说一直写挫---一直改啊-----

好心塞------

技术分享
 1 #include <cstdio>
 2 #include <ctime>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <vector>
 7 #include <map>
 8 #include <set>
 9 #include <stack>
10 #include <queue>
11 #include <string>
12 #include <iostream>
13 #include <algorithm>
14 using namespace std;
15 
16 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
17 
18 typedef long long LL;
19 const double eps = 1e-8;
20 const int INF = (1 << 30) - 1;
21 const int maxn = 200005;
22 
23 struct node{
24     int l,r,s;
25 }t[4*maxn];
26 
27 struct Edge{
28     int pos,val;
29 }a[maxn];
30 
31 int n;
32 int ans[maxn];
33 
34 void Push_up(int p){
35     t[p].s = t[p<<1].s + t[p<<1|1].s;
36 }
37 
38 
39 void Build_tree(int p,int l,int r){
40     t[p].l = l;
41     t[p].r = r;    
42     if(l == r){
43         t[p].s = 1;
44         return;
45     }
46     int mid = getmid(l,r);
47     Build_tree(p<<1,l,mid);
48     Build_tree(p<<1|1,mid+1,r);
49     Push_up(p);
50 }
51 
52 void update(int idx,int p){
53     if(t[p].l == t[p].r){
54         t[p].s--;
55         return;
56     }
57     int mid = getmid(t[p].l,t[p].r);
58     if(idx <= mid) update(idx,p<<1);
59     else update(idx,p<<1|1);
60     Push_up(p);
61 }
62 
63 int query(int idx,int p){
64     if(t[p].l == t[p].r) return t[p].l;
65     if(t[p<<1].s >= idx) return query(idx,p<<1);
66     else return query(idx-t[p<<1].s,p<<1|1); 
67 }
68 
69 void solve(){
70     Build_tree(1,1,n);
71 //    for(int i = 1;i <= 2*n;i++)
72 //    printf("t[%d].l = %d  t[%d].r = %d  t[%d].s = %d\n",i,t[i].l,i,t[i].r,i,t[i].s);
73     for(int i = n;i >= 1;i--){
74         int pos = a[i].pos;
75         int id = query(pos,1);
76         ans[id] = a[i].val;
77         update(id,1);
78     }
79     printf("%d",ans[1]);
80     for(int i = 2;i <= n;i++) printf(" %d",ans[i]);
81     printf("\n");
82 }
83 
84 int main(){
85     while(scanf("%d",&n) != EOF){
86         for(int i = 1;i <= n;i++){
87             scanf("%d %d",&a[i].pos,&a[i].val);
88             a[i].pos++;
89         }
90         solve();
91     }
92     return 0;
93 }
View Code

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

加油啊~~~~

poj 2828 Buy Tickets【线段树 单点更新】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4703390.html

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