http://acm.pku.edu.cn/JudgeOnline/problem?id=2182
题意:给出数的个数、以及这些数的逆序数、求出这些数的顺序。
#include <cstdio>
#include <iostream>
using namespace std;
typedef struct lineTree
{
int left;
int right;
int total;
}LineTree;
LineTree tree[30000];
int data;
int k,data_j;
int number[8050];
int Data[8050];
void CreatTree(int n) //建立线段树Lost,其实是一个中根遍历二叉树
{ //先遍历根结点,然后遍历左结点,最后遍历右结点
k ++;
int j = k;
int i;
tree[j].total = n;
if(n == 1) //当n = 1的时候说明只有一个数,
{
tree[j].left = data_j ++; //用此结点的左儿子表示这个
tree[j].right = -1; // 并用右儿子rig = -1作标记;
return ;
}
i = n/2;
tree[j].left = k+1;
CreatTree(i);
tree[j].right = k+1;
CreatTree(n-i);
}
void Delete(int i,int n) //删除过程,其实也是一个查找过程,具有两个功能 :
{
int j;// 查找和删除要求的点结点
tree[i].total --; //相当于删除一个点,所以总数减少1
if(tree[i].right == -1) // gig = -1说明到了叶子结点,查找完成
{
data_j = tree[i].left;
return ;
}
j = tree[i].left;
if(n <= tree[j].total)
{
Delete(j,n);
return ;
}
else Delete(tree[i].right,n-tree[j].total);
}
int main()
{
int i;
while(scanf("%d",&data) != EOF)
{
k = -1;
data_j = 1;
CreatTree(data);
number[0] = 0;
for(i = 1;i <= data-1;i ++)
scanf("%d",&number[i]);
for(i = data-1;i >= 0;i --)
{
Delete(0,number[i] + 1);
Data[i] = data_j;
}
for(i = 0;i < data;i ++)
printf("%d/n",Data[i]);
}
return 0 ;
}
/*
5
1
2
1
0
2
4
5
3
1
*/