有关逆序的
pku2828
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月26日, 下午7:22
*/
#include <stdlib.h>
#include<stdio.h>
#include<iostream>
using namespace std;
#define N 200005
struct Node
{
int l,r,num;
}Tree[3*N];
int A[N],B[N],C[N];
void Build_Tree(int l,int r,int k)
{
Tree[k].l=l;
Tree[k].r=r;
if(l==r)
{
Tree[k].num=1;
return ;
}
int mid=(l+r)/2;
Build_Tree(l,mid,k+k);
Build_Tree(mid+1,r,k+k+1);
Tree[k].num=Tree[k+k].num+Tree[k+k+1].num;
}
int Find_Num(int k,int pos)
{
Tree[k].num--;
if(Tree[k].l==Tree[k].r)
{
return Tree[k].l;
}
if(pos<=Tree[k+k].num)
{
return Find_Num(k+k,pos);
}
else
{
pos-=Tree[k+k].num;
return Find_Num(k+k+1,pos);
}
}
/*
*
*/
int main(int argc, char** argv) {
int n,i,a,b;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
//cin>>a>>b;
scanf("%d%d",&a,&b);
a++;
A[i]=a;
C[i]=b;
}
Build_Tree(1,n,1);
for(i=n;i>=1;i--)
{
B[Find_Num(1,A[i])]=C[i];
}
for(i=1;i<n;i++)
{
cout<<B[i]<<" ";
}
cout<<B[n]<<endl;
}
return (EXIT_SUCCESS);
}
pku2182
/*
* File: main.cpp
* Author: Administrator
*
* Created on 2010年1月26日, 下午5:06
*/
#include <stdlib.h>
#include<iostream>
using namespace std;
#define N 80005
struct Node
{
int l,r,num;
}Tree[N*3];
int A[N],B[N];
void Build_Tree(int l,int r,int k)
{
Tree[k].l=l;
Tree[k].r=r;
// Tree[k].num=r-l+1;
if(l==r)
{
Tree[k].num=1;
return ;
}
int mid=(l+r)/2;
Build_Tree(l,mid,k+k);
Build_Tree(mid+1,r,k+k+1);
Tree[k].num=Tree[k+k].num+Tree[k+k+1].num;
}
int Find_num(int k,int pos)
{
Tree[k].num--;
if(Tree[k].l==Tree[k].r)
{
return Tree[k].l;
}
//int mid=(Tree[k].l+Tree[k].r)/2;
if(pos<=Tree[k+k].num)
{
return Find_num(k+k,pos);
}
else
{
pos-=Tree[k+k].num;
return Find_num(k+k+1,pos);
}
}
/*
*
*/
int main(int argc, char** argv) {
int n,i,j,k;
while(cin>>n)
{
A[1]=1;
for(i=2;i<=n;i++)
{
cin>>A[i];
A[i]++;
}Build_Tree(1,n,1);
for(i=n;i>=1;i--)
{
B[i]=Find_num(1,A[i]);
}
for(i=1;i<=n;i++)
{
cout<<B[i]<<endl;
}
}
return (EXIT_SUCCESS);
}