poj2828 Buy Tickets
2012-07-27 16:05
369 查看
PS: 起初,很多人说这道题是一道线段树题,可是为什么呢?我一直没有头绪,后来看了解题报告的第一行,我明白了。原来这道题就是基本的线段树。
那个解题报告的第一行写着:倒叙插入,位置就是前边的空格数。如果对线段树了解的话,那你也就明白了。
废话不说了,上代码……
View Code
那个解题报告的第一行写着:倒叙插入,位置就是前边的空格数。如果对线段树了解的话,那你也就明白了。
废话不说了,上代码……
View Code
#include<iostream> #include<string> #include<queue> #include<map> #include<stack> #include<cmath> #include<functional> #include<algorithm> using namespace std; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 200010; int sum[maxn<<2]; int result[maxn]; int n; pair<int,int> order[maxn]; int operate(int a,int b){ return a+b; } void PushUp(int rt){ sum[rt]=operate(sum[rt<<1],sum[rt<<1|1]); } void bulid(int l=1,int r=n,int rt=1){ if(l==r){ sum[rt]=1;return ; } int m=(l+r)>>1; bulid(lson); bulid(rson); PushUp(rt); } void update(int p,int add,int l=1,int r=n,int rt=1){ if(l==r){ sum[rt]=0; result[l]=add; return ; } int m=(l+r)>>1; if(p<sum[rt<<1])update(p,add,lson); else update(p-sum[rt<<1],add,rson); PushUp(rt); } int main(){ int tmp[maxn]; while(~scanf("%d",&n)){ bulid(); for(int i=0;i<n;i++){ scanf("%d%d",&order[i].first,&order[i].second); } for(int i=n-1;i>=0;i--){ update(order[i].first,order[i].second); } for(int i=1;i<=n;i++){ printf("%d%c",result[i],(i^n)?' ':'\n'); } } return 0; }
相关文章推荐
- POJ 2828 Buy Tickets - Segment Tree
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
- poj 2828 Buy Tickets
- poj 2828 Buy Tickets【线段树单点更新】【逆序输入】
- POJ 2828 Buy Ticketshttp://poj.org/problem?id=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
- Buy Tickets poj 2828
- POJ 2828 - Buy Tickets
- poj-2828 Buy Tickets【线段树】
- POJ 2828 Buy Tickets
- poj 2828 Buy Tickets -插队问题-单节点更新-线段树