首页 > 代码库 > POJ 2828 Buy Tickets (线段树)
POJ 2828 Buy Tickets (线段树)
题目大意:
排队有人插队,每一次都插到第 i 个人的后面。
最后输出顺序。
思路分析:
你会发现,如果反向处理的话,你就知道这个人是第几个了。
那么问题一下子就简化了。
就是在线段树上找第几个空位置就行了。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <vector> #define lson num<<1,s,mid #define rson num<<1|1,mid+1,e #define maxn 200005 using namespace std; struct foo { int pos,val; }Q[maxn]; int cnt[maxn<<2]; int v[maxn]; void update(int num,int s,int e,int k,int val){ if(s==e){ cnt[num]++; v[s]=val; return; } int mid=(s+e)>>1; int t=mid-s+1-cnt[num<<1]; if(t>k)update(lson,k,val); else update(rson,k-t,val); cnt[num]=cnt[num<<1]+cnt[num<<1|1]; } int main() { int n; while(scanf("%d",&n)!=EOF) { memset(cnt,0,sizeof cnt); for(int i=1;i<=n;i++){ scanf("%d%d",&Q[i].pos,&Q[i].val); } for(int i=n;i>=1;i--){ update(1,1,n,Q[i].pos,Q[i].val); } for(int i=1;i<=n;i++){ printf("%d%c",v[i],i==n?'\n':' '); } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。