题意:
插队的问题,每个样例给出n,代表有n个插队的,每个给出p,v,意思是代号为v的人插在了第p个人的后面,问最后的队伍的排列?
思路:
最后一个人的位置一定是确定的。依次倒着插入。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
#define lson root<<1, l, mid
#define rson root<<1 | 1, mid+1, r
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 200000+5;
using namespace std;
int pos[maxn], V[maxn], Tree[maxn<<2], ans[maxn];
void Stree_build(int root, int l, int r){
Tree[root] = r - l + 1;
if(l == r) return;
int mid = (l+r) >> 1;
Stree_build(lson);
Stree_build(rson);
}
void update(int k, int l, int r, int root, int val){
if(l == r){
ans[l] = val;
Tree[root] = 0;
return;
}
--Tree[root];
int mid = (l+r) >> 1;
if(k <= Tree[root<<1])
update(k, l, mid, root<<1, val);
else
update(k-Tree[root<<1], mid+1, r, root<<1 | 1, val);
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(scanf("%d",&n) == 1){
for(int i = 1; i <= n; ++i) scanf("%d%d", &pos[i], &V[i]);
Stree_build(1, 1, n);
for(int i = n; i >= 1; --i){
update(pos[i]+1, 1, n, 1, V[i]);
}
for(int i = 1; i <= n; ++i) printf("%d ", ans[i]);
printf("\n");
}
fclose(stdin);
return 0;
}