题意分析:
这道题考察的知识点就是数据结构的笛卡尔树,一下是我从网上找的有管笛卡尔树的一些介绍:
1. 笛卡尔树(key,value):在(解决范围搜索的集合)数据结构问题时提出的,从数列中构造一棵笛卡尔树可以线性时间完成。它具有堆的有序性,中序遍历可以输出原数列。
笛卡尔树的性质
1. 节点一一对应于数列元素
2. 中序遍历笛卡尔树即可得到原数列
3. 树结构存在堆序性质,即任意树节点所对应的数值大(或小)于其左右子树内任意结点对应数值。
这道题只是一道简单的笛卡尔树数据结构的入门题。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct px {
int key,value;
int id;
}s[50005];
int stack[50005],pre[50005],rson[50005],lson[50005];
int cmp(struct px a,struct px b) {
return a.key < b.key;
}
int buildTree(int n) {
int top=-1,k,i;
for(i=0; i<n; i++) {
k=top;
while(k>=0&&s[stack[k]+1].value >s[i+1].value) --k;
if(k>-1) {
pre[s[i+1].id] = s[stack[k]+1].id;
rson[s[stack[k]+1].id] = s[i+1].id;
}
if(k<top) {
pre[s[stack[k+1]+1].id] = s[i+1].id;
lson[s[i+1].id] = s[stack[k+1]+1].id;
}
stack[++k] = i;
top = k;
}
pre[s[stack[0]+1].id]=0;
}
int main() {
int n,i;
cin>>n;
for(i=1; i<=n; i++) {
cin>>s[i].key>>s[i].value;
s[i].id = i;
}
memset(rson,0,sizeof(rson));
memset(lson,0,sizeof(lson));
memset(pre,0,sizeof(pre));
memset(stack,-1,sizeof(stack));
sort(s+1,s+n+1,cmp);
buildTree(n);
printf("YES\n");
for(i=1; i<=n; i++) cout<<pre[i]<<' '<<lson[i]<<' '<<rson[i]<<endl;
return 0;
}