POJ-2201 카 르 테 시안 트 리[피리 칼 트 리]

1726 단어 데이터 구조
제목 링크:http://poj.org/problem?id=2201
제목 의 대의:
피리 칼 나 무 를 만들어 보라 고 한다.
피리 칼 트 리 의 노드 는 2 개의 값,1 개의 key,1 개의 value 를 포함 하 는데 그 중에서 key 는 메 인 키 이 고 value 는 보조 키 이다.피리 칼 나 무 는 키 의 오름차,value 의 오름차 또는 내림차 이다.유사 더미.
treap 와 의 차이 점 은 treap 의 value 는 무 작위 값 으로 나 무 를 더욱 균형 있 게 도입 하기 위 한 것 이 고 피리 칼 트 리 의 value 는 확실한 값 입 니 다.
구조 가 완전히 같 고 기능 이 다르다.이 점 을 이해 하면 트 리 프 를 언제 쓰 고 피리 칼 나 무 를 언제 쓰 는 지 알 수 있다.
피리 칼 트 리 관련 링크:
http://www.hhanger.com/?p=134
http://zh.wikipedia.org/wiki/%E7%AC%9B%E5%8D%A1%E5%B0%94%E6%A0%91
http://en.wikipedia.org/wiki/Cartesian_tree
코드 는 다음 과 같 습 니 다:
#include
#include
#include
#include
#include
using namespace std;

const int N = 50010;
int stack[N];
int pre[N], lson[N], rson[N];

struct node{
	int key, value, id;
}st[N];

bool operator = 0 && st[stack[k] + 1].value > st[i + 1].value) //     i   
			--k;
		if(k != -1)
		{
			pre[st[i + 1].id] = st[stack[k] + 1].id;
			rson[st[stack[k] + 1].id] = st[i + 1].id;
		}
		if(k < top) //  
		{
			pre[st[stack[k + 1] + 1].id] = st[i + 1].id;
			lson[st[i + 1].id] = st[stack[k + 1] + 1].id;
		}
		stack[++k] = i;
		top = k;
	}
	pre[st[stack[0] + 1].id]= 0; //   
}

int main()
{
	int num;
	while(scanf("%d", &num) != EOF)
	{
		init(num);

		for(int i = 1; i <= num; ++i)
		{
			scanf("%d%d", &st[i].key, &st[i].value);
			st[i].id = i;
		}
		sort(st + 1, st + num + 1); // key  

		Build_Cartesian_Tree(num);

		printf("YES
"); for(int i = 1; i <= num; ++i) printf("%d %d %d
", pre[i], lson[i], rson[i]); } return 0; }

좋은 웹페이지 즐겨찾기