poj 2201

来源:互联网 发布:为什么都骂马蓉 知乎 编辑:程序博客网 时间:2024/04/30 00:41

构建笛卡尔树.

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 55000;int fa[maxn],lc[maxn],rc[maxn];struct node{    int num,key,val,f,l,r;} dt[maxn];bool Cmp(node a, node b){    return a.key < b.key;}void Insert(int i){    int j = i - 1;    while(dt[j].val > dt[i].val) j = dt[j].f;    dt[i].l = dt[j].r;    dt[dt[j].r].f = i;    dt[i].f = j;    dt[j].r = i;}void Dfs(int i){    if(i)    {        Dfs(dt[i].l);        fa[dt[i].num] = dt[dt[i].f].num;        lc[dt[i].num] = dt[dt[i].l].num;        rc[dt[i].num] = dt[dt[i].r].num;        Dfs(dt[i].r);    }}int main(){    int n;    scanf("%d",&n);    for(int i = 1; i <= n; ++i)    {        dt[i].num = i;        scanf("%d %d",&dt[i].key,&dt[i].val);        dt[i].f = dt[i].l = dt[i].r = 0;    }    dt[0].f = dt[0].l = dt[0].r =dt[0].key = dt[0].num = 0;    dt[0].val = -999999;    sort(dt+1,dt+n+1,Cmp);    //for(int i =1; i <= n; ++i)    //printf("%d %d\n",dt[i].key,dt[i].val);    for(int i = 1; i<= n; ++i)        Insert(i);    Dfs(dt[0].r);    printf("YES\n");    for(int i = 1; i <=n; ++i)        printf("%d %d %d\n",fa[i],lc[i],rc[i]);    return 0;}


 

 

 

原创粉丝点击