http://poj.org/problem?id=2201
基础笛卡尔树
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N=50005; struct node { int key; int value; int l,r,f; int I; }mem[N]; int bhead,ri; bool cmp(node a,node b) { return a.key<b.key; } int f[N]; int l[N]; int r[N]; void in(int w) { int up=ri; //cout<<up<<" "<<w<<": "<<endl; while(up!=0&&mem[up].value>mem[w].value) { up=mem[up].f; // cout<<up<<" "<<mem[up].value<<endl; }//cout<<endl; if(up==0) {//cout<<"iiii"<<endl; mem[w].l=bhead; mem[w].f=0; mem[bhead].f=w; bhead=w; }else {//cout<<"IIIII"<<endl; mem[w].l=mem[up].r; mem[mem[up].r].f=w; mem[w].f=up; mem[up].r=w; } ri=w; } void dfs(int x) { if(x) { dfs(mem[x].l); dfs(mem[x].r); int i=mem[x].I; f[i]=mem[mem[x].f].I; l[i]=mem[mem[x].l].I; r[i]=mem[mem[x].r].I; } } int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;++i) { mem[i].I=i; scanf("%d %d",&mem[i].key,&mem[i].value); } sort(mem+1,mem+n+1,cmp); bhead=1; ri=1; mem[1].l=0; mem[1].r=0; mem[1].f=0; for(int i=2;i<=n;++i) { mem[i].l=0; mem[i].r=0; in(i);//cout<<mem[bhead].I<<endl; } mem[0].I=0; dfs(bhead); printf("YES\n"); for(int i=1;i<=n;++i) { printf("%d %d %d\n",f[i],l[i],r[i]); } } return 0; }