笛卡尔树模板

题目链接:http://poj.org/problem?id=2201

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=50010;
int stack[N];
int pre[N],lson[N],rson[N];
struct node
{
	int key,value,id;
}a[N];
bool operator <(const node &a, const node &b)
{
	return a.key < b.key;
}
void bct(int n)
{
	int k,top=-1;
	for(int i=0;i<n;i++)
	{
		k=top;
		while(k>=0&&a[stack[k]+1].value>a[i+1].value)
		k--;
		if(k!=-1)
		{
			pre[a[i+1].id]=a[stack[k]+1].id;
			rson[a[stack[k]+1].id]=a[i+1].id;
		}
		if(k<top)
		{
			pre[a[stack[k+1]+1].id]=a[i+1].id;
			lson[a[i+1].id]=a[stack[k+1]+1].id;
		}
		stack[++k]=i;
		top=k;
	}
	pre[a[stack[0]+1].id]=0;
}
int main()
{
	int num;
	scanf("%d",&num);
	memset(stack,-1,sizeof(stack));
	for(int i=1;i<=num;i++)
	{
		scanf("%d%d",&a[i].key,&a[i].value);
		a[i].id=i;
	}
	sort(a+1,a+num+1);
	bct(num);
	printf("yes\n");
	for(int i=1;i<=num;i++)
	printf("%d %d %d\n",pre[i],lson[i],rson[i]);
	return 0;
} 
全部评论

相关推荐

06-15 20:57
已编辑
门头沟学院 Java
CARLJOSEPH...:年轻人有傲气很正常,但是建议工作前洗净傲气。 说实在的,什么奖学金什么奖项的都很一般。尊重你的老师,在有时间的时候去上课,真遇到走不开的事,请态度端正地向你的老师说明情况,请求请假。我相信任何一个有师德的老师都会允许的(我的老师就是这样)。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务