poj 2828 Buy Tickets (简单线段数)

又一道线段树的题~~很简单的一道题,用数组建树很容易理解线段树的内部结构~~

题目大意:有N个人排队,给出他们想插队的位置和他们的标识,问最后的序列是怎样的。

看代码吧:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int f[1000005];
int pos[200004],val[200004],s[200004];
int n;

void built(int t,int lc,int rc)//建树过程
{
f[t]=rc-lc+1;//保存n前面有多少空位
if(lc==rc)
return ;
int mid=(lc+rc)/2;
built(2*t,lc,mid);
built(2*t+1,mid+1,rc);
}

void insert(int p,int v,int t,int lc,int rc)
{
f[t]--;
if(lc==rc)
{
s[lc]=v;
return ;
}
int mid=(lc+rc)/2;
if(p<=f[2*t])
insert(p,v,2*t,lc,mid);
else
{
p-=f[2*t];//减去前面的空位数
insert(p,v,2*t+1,mid+1,rc);
}
}

int main()
{
int i,j;

while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&pos[i],&val[i]);
pos[i]++;//使所有位置从1开始
}
built(1,1,n);
for(i=n-1;i>=0;i--)
insert(pos[i],val[i],1,1,n);
for(i=1;i<=n;i++)
{
if(i==1)
printf("%d",s[i]);
else
printf(" %d",s[i]);
}
printf("\n");
}
return 0;
}



 

原文地址:https://www.cnblogs.com/misty1/p/2431100.html