题目大意:有一群人要插队, 现在给出组要插队的人要插到第几个人后, 和该人对应的编号, 求最后这个队列从头到尾所对应的编号。
思路:一开始用线性表和链表试了下都超时了, 无赖想不出怎么用线段树, 可耻的看了解题报告, 换一个思路, 从最后一个人往回推,就有思路了。
code:
#include <stdio.h>
#define N 200002
using namespace std;
int p[N], v[N], ans[N], t[4*N];
void build_tree(int c, int l, int r)
{
int m = l+(r-l)/2;
t[c] = r-l+1;
if(l == r) return ;
build_tree(2*c, l, m);
build_tree(2*c+1, m+1, r);
}
void query(int c, int l, int r, int p, int v)
{
t[c]--;
int m = l+(r-l)/2;
if(l == r)
{
ans[l] = v;
return ;
}
if(p<t[2*c]) query(2*c, l, m, p, v);
else query(2*c+1, m+1, r, p-t[2*c], v);
}
int main()
{
int i = 0, j = 0, n = 0;
while(scanf("%d", &n) != EOF)
{
build_tree(1, 0, n-1);
for(i = 0; i<n; i++)
scanf("%d %d", &p[i], &v[i]);
for(i = n-1; i>-1; i--)
query(1, 0, n-1, p[i], v[i]);
for(i = 0; i<n-1; i++)
printf("%d ", ans[i]);
printf("%d\n", ans[i]);
}
return 0;
}