pojBuy Tickets(线段树)

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 const int N = 200000 + 10;
 6 
 7 int a[N], Tree[N << 2], ans[N], b[N];
 8 
 9 void Build(int l, int r, int rt) {
10     Tree[rt] = r - l + 1;
11     if (l == r) {
12         return;
13     }
14     int m = (l + r) >> 1;
15     Build(l, m, rt << 1);
16     Build(m + 1, r, rt << 1 | 1);
17 }
18 void Update(int p, int val, int l, int r, int rt) {
19     Tree[rt]--;
20     if (l == r) {
21         ans[l] = val;
22         return;
23     }
24     int m = (l + r) >> 1;
25     if (p <= Tree[rt << 1]) Update(p, val, l, m, rt << 1);
26     else Update(p - Tree[rt << 1], val, m + 1, r, rt << 1 | 1);
27 }
28 
29 int main() {
30 
31     ios::sync_with_stdio(0);
32     cin.tie(0);
33     int n;
34     while (scanf("%d", &n) != EOF) {
35         memset(Tree, 0, sizeof(Tree));
36         Build(1, n, 1);
37         for (int i = 1; i <= n; i++) {
38             scanf("%d %d", &a[i], &b[i]);
39         }
40         for (int i = n; i >= 1; i--) {
41             Update(a[i] + 1, b[i], 1, n, 1);
42         }
43         for (int i = 1; i <= n; i++) {
44             printf("%d ", ans[i]);
45         }
46         printf("\n");
47     }
48 
49     return 0;
50 }

 需要注意的是,本题用cin,cout会超时,即使使用

ios::sync_with_stdio(0);优化也会超时,直接使用scanf,printf就可以了
posted @ 2022-03-20 16:12  Keyzee  阅读(18)  评论(0编辑  收藏  举报