POJ2828 思维难度较好的一道线段树
2012-07-15 15:15
176 查看
题目大意:一条队伍 ,给你每个人插队的状态,得到最后的队伍状态
思路:容易从后方去思考,首先最后一个百分之百可以确定的 而倒数第二个 倒着来看 他之前必定还有pos[i]个人 (未包括后面的人)所以能需要空pos[i]个人的位置就是倒数第二个人的位置,同理可得倒数第三 倒数第四,而线段树就去维护空位的信息
思路:容易从后方去思考,首先最后一个百分之百可以确定的 而倒数第二个 倒着来看 他之前必定还有pos[i]个人 (未包括后面的人)所以能需要空pos[i]个人的位置就是倒数第二个人的位置,同理可得倒数第三 倒数第四,而线段树就去维护空位的信息
#include<stdio.h> #define maxn 200005 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 int empty[maxn<<2]; int A[maxn],B[maxn],C[maxn]; int Pushup(int rt) { empty[rt]=empty[rt<<1]+empty[rt<<1|1]; } int build(int l,int r,int rt) { if(l==r) {empty[rt]=1;return 0;} int m=(l+r)>>1; build(lson); build(rson); Pushup(rt); } int query(int x,int l,int r,int rt) { int temp,m; m=(l+r)>>1; if(l==r) {empty[rt]--;return l;} if(x<=empty[rt<<1]) temp=query(x,lson); else x=x-empty[rt<<1],temp=query(x,rson); Pushup(rt); return temp; } int main() { freopen("poj2828.in","r",stdin); freopen("poj2828.out","w",stdout); int N,i; while(~scanf("%d",&N)) { build(1,N,1); for(i=1;i<=N;i++) scanf("%d%d",&A[i],&B[i]); for(i=N;i>=1;i--) C[query(A[i]+1,1,N,1)]=B[i]; for(i=1;i<=N;i++) printf("%d ",C[i]); printf("\n"); } return 0; }
相关文章推荐
- POJ2828 思维难度较好的一道线段树
- POJ 2828(线段树,思维,逆序数变形题)
- POJ 2828 Buy Tickets 线段树 + 思维
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
- poj 2828 Buy Tickets(数据结构:线段树)
- POJ 2828 Buy Tickets (线段树 单点更新 变形)
- POJ 2828 Buy Tickets 又是线段树!
- poj-2828 Buy Tickets【线段树】
- poj-2828-Buy Tickets-线段树-单点
- POJ 2828 Buy Tickets 线段树
- POJ 2828 Buy Tickets 线段树
- POJ 2828 Buy Tickets 线段树 单点更新
- 【转】poj pku 线段树题目20道汇总+简要算法+分类+难度
- POJ 2828 Buy Tickets(线段树-单点更新)
- POJ 2828 Buy Tickets(线段树 )
- poj2828之线段树单点更新
- POJ 2828 Buy Tickets(线段树:查找并更新从左到右第i个1)
- poj 2828 线段树单点更新
- POJ 2828: Buy Tickets(线段树)
- POJ 2828 (线段树 单点更新) Buy Tickets