程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ - 2828 - Buy Tickets (線段樹)

POJ - 2828 - Buy Tickets (線段樹)

編輯:C++入門知識

POJ - 2828 - Buy Tickets (線段樹)


 

題目傳送:Buy Tickets

 

思路:線段樹,從後往前依次插入,插入一個更新一次

 

AC代碼:

 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include 
#include 
#include 
#define LL long long
#define INF 0x7fffffff
using namespace std;

const int maxn = 200005;

struct node {
	int pos, v;
}a[maxn];

int x[maxn << 2], num[maxn];

void build(int l, int r, int rt) {
	x[rt] = r - l + 1;
	if(r == l) return;
	int mid = (r + l) >> 1;
	build(l, mid, rt << 1);
	build(mid + 1, r, rt << 1 | 1);
}

int query(int p, int l, int r, int rt) {
	x[rt] --;
	if(l == r) return l;
	int mid = (l + r) >> 1;
	if(x[rt << 1] >= p) return query(p, l, mid, rt << 1);
	else return query(p - x[rt << 1], mid + 1, r, rt << 1 | 1);
}

int main() {
	int n;
	while(scanf("%d", &n) != EOF) {
		for(int i = 1; i <= n; i ++) {
			scanf("%d %d", &a[i].pos, &a[i].v);
		}
		build(1, n, 1);
		for(int i = n; i >= 1; i --) {
			int p = query(a[i].pos + 1, 1, n, 1);
			num[p] = a[i].v;
		}
		for(int i = 1; i < n; i ++) {
			printf("%d ", num[i]);
		}
		printf("%d\n", num[n]);
	}
	return 0;
}


 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved