您的位置:首页 > 其它

线段树典型例题--poj2828

2012-07-23 17:11 302 查看
逆序处理。

注意到如果逆序插入,则每次插入的位置都是第x个空位。

所以可以用线段树来寻找第x个合法位置

【代码】

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;

const int N=200005;

int sum[N*3],pos
,val
,p
;
int n;

void build(int i,int l,int r)
{
sum[i]=r-l+1;
if (l==r) return;
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
}

void ins(int i,int l,int r,int pos,int val)
{
sum[i]--;
if (l==r)
{
p[l]=val;
return;
}
int mid=(l+r)/2;
if (sum[i*2]-pos>=0)
ins(i*2,l,mid,pos,val);
else
ins(i*2+1,mid+1,r,pos-sum[i*2],val);
}

int main()
{
int i;

freopen("in","r",stdin);
while (scanf("%d",&n)!=EOF)
{
for (i=1;i<=n;i++)
scanf("%d%d",&pos[i],&val[i]);
build(1,1,n);
for (i=n;i>=1;i--)
ins(1,1,n,pos[i]+1,val[i]);
for (i=1;i<n;i++)
printf("%d ",p[i]);
printf("%d\n",p
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: