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

倒着插,倒着插,这道题是倒着插!

想一下如果 Posi 里面有若干个0,那么排在最前面的一定是最后一个0.

从后往前看,对于第i个数,就应该插在第Posi + 1个空位上,所以用线段树来维护区间空位的个数。

说一下那个坑爹的第56行的判断:

if(i > 1) printf(" ");

将输出的n个数用空格隔开,我感觉这是一个还算常用的写法啊,结果各种莫名TLE,加上输入挂也补救不回来。

去掉这个无谓的判断后,3594MS险过,加上输入挂3094MS,还算是起到了一定的加速作用。

 1 #include <cstdio>
 2 #include <ctype.h>
 3
 4 const int maxn = 200000 + 10;
 5
 6 int n, p[maxn], v[maxn], a[maxn];
 7 int sum[maxn << 2];
 8
 9 inline int Scan()
10 {
11   char c = getchar();
12   while(!isdigit(c)) c = getchar();
13
14   int x = 0;
15   while(isdigit(c)) {
16     x = x * 10 + c - ‘0‘;
17     c = getchar();
18   }
19   return x;
20 }
21
22 void build(int o, int L, int R)
23 {
24     if(L == R) { sum[o] = 1; return; }
25     int M = (L + R) / 2;
26     build(o<<1, L, M);
27     build(o<<1|1, M+1, R);
28     sum[o] = sum[o<<1] + sum[o<<1|1];
29 }
30
31 void update(int o, int L, int R, int p, int v)
32 {
33     if(L == R) { sum[o] = 0; a[L] = v; return; }
34     int M = (L + R) / 2;
35     if(sum[o<<1] >= p) update(o<<1, L, M, p, v);
36     else update(o<<1|1, M+1, R, p-sum[o<<1], v);
37     sum[o] = sum[o<<1] + sum[o<<1|1];
38 }
39
40 int main()
41 {
42     //freopen("in.txt", "r", stdin);
43
44     while(scanf("%d", &n) == 1)
45     {
46         build(1, 1, n);
47         for(int i = 0; i < n; i++)
48         {
49             p[i] = Scan();
50             v[i] = Scan();
51         }
52         for(int i = n - 1; i >= 0; i--) update(1, 1, n, p[i]+1, v[i]);
53         printf("%d", a[1]);
54         for(int i = 2; i <= n; i++)
55         {
56             //if(i > 1) printf(" ");
57             printf(" %d", a[i]);
58         }
59         printf("\n");
60     }
61
62     return 0;
63 }

代码君

时间: 2024-08-06 11:56:26

POJ 2828 (线段树 单点更新) Buy Tickets的相关文章

poj 2828(线段树单点更新)

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 18561   Accepted: 9209 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue… The Lunar New Year wa

POJ 2828 线段树单点更新 离线搞

Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue- The Lunar New Year was approaching, but unluckily the Little Cat still had schedules going here and there. Now, he ha

POJ 2886 线段树单点更新

转载自:http://blog.csdn.net/sdj222555/article/details/6878651 反素数拓展参照:http://blog.csdn.net/ACdreamers/article/details/25049767 题目大意就是一群熊孩子做游戏,第一个出队的人是编号为k的人.此后出队的人就是按照前一个人手里的编号.如果是正数+m就是这个人的左边的第m个人.如果是负数-m,就是 这个人的右边第m个人.由于这个人出队了.对下一个人有影响,所以+m的时候,是k+m-1.

POJ 2828 Buy Tickets (线段树 单点更新 变形)

题目链接 题意:有N个人排队,给出各个人想插队的位置和标识,要求输出最后的序列. 分析:因为之前的序列会因为插队而变化,如果直接算时间复杂度很高,所以可以用 线段树逆序插入,把序列都插到最后一层,len记录该区间里还剩余多少位置,插入的时候就插到剩余的第几个位置, 比如1,2已经插入了,如果再想插入第3个位置,则实际上插入的是5. 因为是逆序的,所以在3之前除了现在的1,2 还有之前的1,2. 1 #include <iostream> 2 #include <cstdio> 3

Buy Tickets+POJ+线段树单点更新的灵活运用

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12927   Accepted: 6410 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue- The Lunar New Year wa

POJ训练计划2828_Buy Tickets(线段树/单点更新)

解题报告 题意: 插队完的顺序. 思路: 倒着处理数据,第i个人占据第j=pos[i]+1个的空位. 线段树维护区间空位信息. #include <iostream> #include <cstdio> #include <cstring> using namespace std; struct node { int x,v; } num[201000]; int sum[1000000],ans[201000]; void cbtree(int rt,int l,in

poj-----(2828)Buy Tickets(线段树单点更新)

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12930   Accepted: 6412 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue… The Lunar New Year wa

POJ训练计划2299_Ultra-QuickSort(线段树/单点更新)

解题报告 题意: 求逆序数. 思路: 线段树离散化处理. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; LL sum[2001000],num[501000],_hash[501000]; void push_up(int rt) { sum[rt]=sum[rt*2

POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Description BackgroundRaymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just b