POJ 2828 Buy Tickets

原创 2012年03月22日 22:31:12

http://poj.org/problem?id=2828

题意:有n个人陆续来到一个队列里排队(插队),第i个来的人插入到pos[i]位置中,问最后的队列情况。


思路:线段树,和之前的一道题目的思想是一样的,从最后一个往前推,对于最后一个人(pos,val),在1-N中,他的位置应该是pos+1位,依次类推就可以将整个队列都推出来了。维护一颗线段树,线段树的每个结点存放一个num变量,表示该线段区间内还有多少个位置没有被占用。时间复杂度为:O(n*logn)。

代码:

#include<stdio.h>
#include<string.h>
#define MAXN 200010
int N ;
int pos[MAXN] ;
int val[MAXN] ;
struct Node{
	int l,r;
	int num ;		//标记区间还有多少个结点未被占用	
}p[4*MAXN] ;
int ans[MAXN] ;
void Build(int l , int r, int idx){
	p[idx].l = l ;
	p[idx].r = r ;
	p[idx].num = r - l + 1;
	if(l == r){
		p[idx].num = 1 ;
		return ;	
	}
	int mid = (l + r) >> 1 ;
	Build(l,mid,idx<<1);
	Build(mid+1,r,(idx<<1)+1) ;
}
void update(int pos ,int idx,int i){	
	p[idx].num-- ;
	if(p[idx].l == p[idx].r){
		ans[ p[idx].l ] = i ;
		return ;	
	}
	int mid = (p[idx].l + p[idx].r) >> 1 ;
	if(p[idx<<1].num < pos){
		update(pos-p[idx<<1].num , (idx<<1)+1,i);	
	}
	else{
		update(pos,idx<<1,i);	
	}
}

int main(){
	int pp ;
	while(scanf("%d",&N) ==1){
		for(int i=1;i<=N;i++){
			scanf("%d %d",&pos[i] , &val[i]);	
		}	
		Build(1,N,1);
		for(int i=N;i>=1;i--){
			pp = pos[i] ;
			update(pp+1,1,i);				
		}
		for(int i=1;i<=N;i++){
			int n = ans[i] ;
			printf("%d%c",val[n],i==N?'\n':' ');	
		}
	}
	return  0;
}


POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12296   A...

POJ 2828 Buy Tickets(线段树-单点更新)

点击打开链接 比较裸的线段树,主要在能不能想到(。ì _ í。) /* 思路: 设当前节点为root,其左孩子为lchild,右孩子为rchild,节点的存放变量为val,待插入数值为value....
  • Q_smell
  • Q_smell
  • 2017年04月07日 21:21
  • 103

POJ 2828 Buy Tickets (线段树 单点更新-查找第k大元素)

题目链接POJ2828题目大意火车站有n(n≤\le200000)个人要排队,它们是按顺序到达,到达后要插队,现在告诉你每个人每次插队排在当前队伍第几个人的后面以及它们的权值,输出最终队伍的权值序列。...

poj 2828 Buy Tickets 线段树单点更新

题意:有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出 //#include #include #include #incl...

POJ 2828 Buy Tickets (线段树单点更新)

Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 10957 Accepted: 5338 Descr...

poj 2828 Buy Tickets (线段树 单节点 查询位置更新)

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15533   Accepted: 775...
  • lsgqjh
  • lsgqjh
  • 2015年07月25日 11:34
  • 594

POJ 2828 Buy Tickets(单点更新)

题意:有n个的排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出。 逆向思维。我们可以这样考虑,最后一个人一定会得到当前队伍他想要的位置,如...

poj 2828 Buy Tickets 线段树

题意/Description:     Railway tickets were difficult to buy around the Lunar New Year in China, so we...

POJ_2828_Buy Tickets_线段树、机智

void chedan(){ for(;;) puts("好困啊"); }

POJ—2828—Buy_Tickets—【数据结构】【线段树】【单点更新】

Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 14512   A...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2828 Buy Tickets
举报原因:
原因补充:

(最多只允许输入30个字)