标签:
题目地址:http://poj.org/problem?id=2828
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.
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <iostream> #include <algorithm> using namespace std; struct seq { int pos, val; }a[200000+10]; int num[800000+100]; int ans[200000+100]; void Build(int rt, int ll, int rr) { num[rt]=rr-ll+1; if(ll==rr) return;//已经到达根节点 Build(rt*2, ll, (ll+rr)/2 ); Build(rt*2+1, (ll+rr)/2+1, rr ); } int update(int pos, int rt, int ll, int rr) { num[rt]--;//空位置数量-1 if(ll==rr) return ll;//到达根节点 if(num[rt*2]>pos)//pos是从0开始的 而线段树是从1开始存储的 但0和1在此题中是对应存储的 return update(pos, rt*2, ll, (ll+rr)/2); else return update(pos-num[rt*2], rt*2+1, (ll+rr)/2+1, rr); } int main() { int n, i; while(scanf("%d", &n)!=EOF) { for(i=0; i<n; i++){ scanf("%d %d", &a[i].pos, &a[i].val); }//打表保存 Build(1, 1, n);//从1号节点开始建树 区间[1,n] /* for(i=1; i<=7; i++) printf("%d---", num[i]); */ for(i=n-1; i>=0; i--){ ans[update(a[i].pos, 1, 1, n)]=a[i].val; // } for(i=1; i<=n; i++){ printf("%d%c", ans[i], i==n?‘\n‘:‘ ‘); } } return 0; }
poj 2828 Buy Tickets 【买票插队找位置 输出最后的位置序列+线段树】
标签:
原文地址:http://www.cnblogs.com/yspworld/p/4741503.html