逆序插入,这样就能把第i个位置上的人确定下来了。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 210000
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int n,id;
int pos[maxn],num[maxn],sq[maxn];
int tree[maxn<<2];
void build(int l,int r,int rt)
{
int m=(l+r)>>1;
tree[rt]=r-l+1;
if(l==r)
{
return;
}
build(lson);
build(rson);
}
void update(int l,int r,int rt,int p)
{
int m=(l+r)>>1;
tree[rt]--;
if(l==r)
{
id=l;
return;
}
if(tree[rt<<1]>=p)
{
update(lson,p);
}
else
{
p-=tree[rt<<1];
update(rson,p);
}
}
int main()
{
while(~scanf("%d",&n))
{
build(1,n,1);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&pos[i],&num[i]);
}
for(int i=n;i>=1;i--)
{
update(1,n,1,pos[i]+1);
sq[id]=num[i];
}
printf("%d",sq[1]);
for (int i=2;i<=n;i++)
printf(" %d",sq[i]);
printf("\n");
}
return 0;
}

本文介绍了一种使用逆序插入的算法实现过程,通过构建区间树来高效地更新和查询区间内的元素。该算法适用于需要在线性时间内完成排序任务的问题,并提供了一个具体的C++代码示例。
420

被折叠的 条评论
为什么被折叠?



