线段树(单点更新) POJ 2828 Buy tickets

本文针对POJ2828购票问题提供了一种解决方案,通过使用线段树来实现对售票过程的模拟。具体介绍了如何构建线段树、更新节点信息以及查找插入位置等关键步骤。

 

题目传送门

 1 /*
 2     结点存储下面有几个空位
 3     每次从根结点往下找找到该插入的位置,
 4     同时更新每个节点的值
 5 */
 6 #include <cstdio>
 7 #define lson l, m, rt << 1
 8 #define rson m+1, r, rt << 1 | 1
 9 
10 const int MAX_N = 200000 + 10;
11 int pos[MAX_N], val[MAX_N];
12 int sum[MAX_N << 2];
13 int que[MAX_N];
14 int id;
15 
16 void build(int l, int r, int rt)
17 {
18     sum[rt] = r - l + 1;        //节点有多少个空位置
19     if (l == r)        return ;
20     int m = (l + r) >> 1;
21     build (lson);
22     build (rson);
23 }
24 
25 void update(int p, int l, int r, int rt)
26 {
27     sum[rt]--;                    //插入一个减少一个空位置
28     if (l == r)                    //找到了传递该位置
29     {
30         id = l;
31         return ;
32     }
33     int m = (l + r) >> 1;
34     if (p <= sum[rt<<1])
35     {
36         update (p, lson);
37     }
38     else
39     {
40         p -= sum[rt<<1];    //减去
41         update (p, rson);
42     }
43 }
44 
45 int main(void)        //POJ 2828 Buy tickets
46 {
47     //freopen ("inE.txt", "r", stdin);
48     int n;
49 
50     while (~scanf ("%d", &n))
51     {
52         build (1, n, 1);
53         for (int i=1; i<=n; ++i)
54         {
55             scanf ("%d%d", &pos[i], &val[i]);
56         }
57         for (int i=n; i>=1; --i)        //最后插入的位置不变
58         {
59             update (pos[i]+1, 1, n, 1);
60             que[id] = val[i];
61         }
62         printf ("%d", que[1]);
63         for (int i=2; i<=n; ++i)
64         {
65             printf (" %d", que[i]);
66         }
67         puts ("");
68     }
69 
70     return 0;
71 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4506523.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值