poj 2201 笛卡尔树

来源:互联网 发布:扫描编辑软件 编辑:程序博客网 时间:2024/05/16 19:57

这个数据结构看上去非常巧妙,不过没有找到实用的例题。。。。

#include<iostream>#include<cstdio>#include<algorithm>#define maxn 50005using namespace std;struct Pair{    int key,aux,id;    int fa,ch[2];    void print()    {printf("%d %d %d\n",fa,ch[0],ch[1]);}}p[maxn];bool cmp(Pair A,Pair B){return A.key<B.key;}bool cmp2(Pair A,Pair B){return A.id<B.id;}int S[maxn],top;int main(){    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        read(p[i].key);        read(p[i].aux);        p[i].id=i;    }    sort(p+1,p+n+1,cmp);    for(int i=1;i<=n;i++)    {        while(top)        {            if(p[S[top]].aux<p[i].aux)                break;            top--;        }        int f=S[top];        int t=p[f].ch[1];        p[f].ch[1]=i;        p[i].fa=f;        p[t].fa=i;        p[i].ch[0]=t;        S[++top]=i;    }    for(int i=1;i<=n;i++)    {        int x=p[i].fa;p[i].fa=p[x].id;        x=p[i].ch[0];p[i].ch[0]=p[x].id;        x=p[i].ch[1];p[i].ch[1]=p[x].id;    }    sort(p+1,p+n+1,cmp2);    puts("YES");    for(int i=1;i<=n;i++)        p[i].print();    return 0;}
1 0
原创粉丝点击