POJ2828 Buy Tickets 樹狀數組

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…ios

The Lunar New Year was approaching, but unluckily the Little Cat still had schedules going here and there. Now, he had to travel by train to Mianyang, Sichuan Province for the winter camp selection of the national team of Olympiad in Informatics.數組

It was one o’clock a.m. and dark outside. Chill wind from the northwest did not scare off the people in the queue. The cold night gave the Little Cat a shiver. Why not find a problem to think about? That was none the less better than freezing to death!app

People kept jumping the queue. Since it was too dark around, such moves would not be discovered even by the people adjacent to the queue-jumpers. 「If every person in the queue is assigned an integral value and all the information about those who have jumped the queue and where they stand after queue-jumping is given, can I find out the final order of people in the queue?」 Thought the Little Cat.less

Inputide

There will be several test cases in the input. Each test case consists of N + 1 lines where N (1 ≤ N ≤ 200,000) is given in the first line of the test case. The next N lines contain the pairs of values Posi and Vali in the increasing order of i (1 ≤ i ≤ N). For each i, the ranges and meanings of Posi and Vali are as follows:url

  • Posi ∈ [0, i − 1] — The i-th person came to the queue and stood right behind the Posi-th person in the queue. The booking office was considered the 0th person and the person at the front of the queue was considered the first person in the queue.
  • Vali ∈ [0, 32767] — The i-th person was assigned the value Vali.

There no blank lines between test cases. Proceed to the end of input.spa

Output

For each test cases, output a single line of space-separated integers which are the values of people in the order they stand in the queue..net

Sample Input

4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492

Sample Output

77 33 69 51
31492 20523 3890 19243

Hint

The figure below shows how the Little Cat found out the final order of people in the queue described in the first test case of the sample input.code

Sourceorm

 
提交地址 :  Buy Tickets 
 
題目大意 : 來了n我的, 每一個人在隊列裏選擇了一個位置插入, 問最後的序列是什麼樣的;
 
分析:
時光倒流:由於最後的人確定是站在本身想佔的地方, 因此從後往前便於處理;
首先設一我的都沒有, 序列所有爲1(後面講爲何);
而後插入最後一我的, 那樣例二來講, 他確定是插在了本身想在的地方, 因此把他所站的地方設爲0, 序序列便成爲了 0 1 1 1;
而後考慮倒數第二我的, 他要去第二的位置可是在他以前已經插入了最後一我的, 因此他最終的位置必定不是在第二個位置;
那是在第幾個位置呢? 答案是:第二個1!爲何, 由於1表示此位置還未被佔, 因此他要站在第二個沒有被佔得位置上;
求前綴1的值咱們能夠用樹狀數組維護(這就是初始值是1的緣由!);
可是對於沒我的都要枚舉一遍顯然是不現實的, 又由於前綴和知足單調性, 因此直接暴力二分OK;
 
應該特別好理解;
不理解的看看代碼就差很少了;
代碼奉上:
 
//By zZhBr
#include <iostream> #include <cstdio> #include <algorithm>
using namespace std; int n; struct pro { int pos; int num; }pr[200010]; int ans[200010]; int tr[200010]; int lowbit(int x) { return x & -x; } void add(int x, int y) { while(x <= n) { tr[x] += y; x += lowbit(x); } } int sum(int x) { int ans = 0; while(x != 0) { ans += tr[x]; x -= lowbit(x); } return ans; } int main() { while(scanf("%d", &n) != EOF) { for(register int i = 1 ; i <= n ; i ++) ans[i] = 0; for(register int i = 1 ; i <= n ; i ++) { scanf("%d%d", &pr[i].pos, &pr[i].num); add(i, 1); } for(register int i = n ; i >= 1 ; i --) { int p = pr[i].pos + 1; if(sum(p) == p) { ans[p] = pr[i].num; add(p, -1); continue; } int l = p, r = n; while(l  < r) { int mid = l + r >> 1; if(sum(mid) >= p) r = mid; else l = mid + 1; } ans[l] = pr[i].num; add(l, -1); } for(register int i = 1 ; i <= n ; i ++) { printf("%d ", ans[i]); } printf("\n"); } return 0; }
zZhBr
相關文章
相關標籤/搜索