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

题解:
这题我们会发现,如果正着操作,每次加入会带来相对位置的变化,不太好操作。
正难则反。
我们倒着进行操作。
先处理第n个人的位置,第n个人一定是在p[n]+1这个位置上了。

当问题规模为n时,确定 n所在位置,删除这个位置后,问题就可以递归成规模为n-1 的问题,因为这 n-1个人的相对位置关系是与n无关的。
只是要在考虑绝对位置的时候,留出n所在的空位。那么问题就变成了,一开始有n个位置,每次我们查询从左往右数第k 个空位置,然后放置一个人(即把它变为非空)。

如何维护空位,我们可以用1代表空位,如果当前位置有人,就把他修改为0.
如何快速找出第k个空位置,我们可以用线段树动态维护前缀和。
前缀和=k时,下标即为要找的位置。

因为线段树本身就是有分治的性质,所以我们可以直接在线段树上进行二分。
k代表要插入的位置。
如果sum[node]<=k,则进入左子树。
否则k-sum[2*node],进入右子树。

跟平衡树求第几大差不多?(疑问句

代码:

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
//#define int long long
#define endl '\n'using namespace std;
const int maxn=1e6+10;
const int mod=1e9+7;pair<int,int>v[maxn];
int tree[maxn];
void build(int node,int start,int ends){if(start==ends){tree[node]=1;return ;}int mid=(start+ends)/2;build(node*2,start,mid);build(node*2+1,mid+1,ends);tree[node]=tree[node*2]+tree[node*2+1];
}int up(int node,int start,int ends,int val){if(start==ends){tree[node]=0;return start;}int mid=(start+ends)/2;int res=0;if(val<=tree[node*2]) res=up(node*2,start,mid,val);else res=up(node*2+1,mid+1,ends,val-tree[node*2]);tree[node]=tree[node*2]+tree[node*2+1];return res;
}
int ans[maxn];signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n;while(cin>>n){for(int i=0;i<n;i++){//int x,y;cin>>v[i].first>>v[i].second;}build(1,1,n);for(int i=n-1;i>=0;i--){int k=up(1,1,n,v[i].first+1);ans[k]=v[i].second;}for(int i=1;i<=n;i++){cout<<ans[i]<<" ";}cout<<endl;}
}

POJ 2828-Buy Tickets(线段树上二分)相关推荐

  1. POJ 2828 Buy Tickets 线段树

    题目: http://poj.org/problem?id=2828 很巧妙的题,逆序插入线段树,这样元素不用移动.用二叉排序树也能过. 1 #include <stdio.h> 2 #i ...

  2. POJ - 2828 Buy Tickets(线段树+思维/Splay+模拟)

    题目链接:点击查看 题目大意:给出n个人,一个队列,一开始队列是空的,每个人加入的时候都会插入到指定位置pos的后面,即插队,问最后队列的排列情况是怎么样的 题目分析:一开始很难想到是线段树的题目,毕 ...

  3. POJ 2828 Buy Tickets | 线段树的喵用

    题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...

  4. poj 2828 Buy Tickets

    http://poj.org/problem?id=2828 题意:在一个队列里,有人依次向第pos个位置插入,求最后的序列: 思路:用线段树存储区间内剩余的没有被占的位置,注意插入的时候要从后向前插 ...

  5. POJ 2828. Buy Tickets

    链接 http://poj.org/problem?id=2828 题意 有 NNN 个人排队,每一个人都有一个权值 valvalval ,每一个人都会按顺序插入到当前队伍的某一个位置 posposp ...

  6. #树状数组#poj 2828 Buy Tickets

    题目 输入插队的人和插队的位置,求最终所有人的位置. 分析 树状数组,从后往前(倒推),然后就是要让在前面的次序-1. 代码 #include <cstdio> #include < ...

  7. [XSY4170] 妹子(线段树上二分)

    传送门 题意: 给出两个长度为NNN的整数序列A1A2...ANA_1A_2...A_NA1​A2​...AN​,B1B2...BNB_1B_2...B_NB1​B2​...BN​.有MMM组询问(o ...

  8. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  9. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...

最新文章

  1. 理科的至尊思想:进制之间的转换
  2. 让product description 成为mandatory field
  3. leetcode83,删除有序链表中的重复元素
  4. linux交叉编译aix_mips-linux-gcc交叉编译工具链搭建小结【转】
  5. weblogic命令行操作
  6. oracle查询cpu占用率高,解决oracle进程CPU占用过高问题
  7. Bootstrap3 滚动监听插件的选项
  8. 每个日期新用户的次日留存率
  9. 基于sklearn进行文本向量化
  10. HDU 1027 G - Can you answer these queries?
  11. 【Android】魅族Flyme OS 3摄像头无法预览的问题
  12. java基类和派生类圆_java – 当基类和派生类都具有相同名称的变量时会发生什么...
  13. 【AtCoder】ARC083
  14. 计算机在酒店的应用ppt,计算机应用论文的专辑
  15. Compilation failed to complete
  16. 微信为什么使用 SQLite 保存聊天记录?
  17. 个人LaTeX笔记(九)
  18. 开源项目推荐:运动控制速度前瞻算法(Look-Ahead),连续小线段高速插补算法
  19. 网吧XP无盘系统集成优化及母盘封装
  20. BandZip cmd调用参数

热门文章

  1. 所谓移动IP是指(58);实现移动IP的关键技术是(59)。【答案】D B
  2. 技术16期:如何更好的保证数据质量【大数据篇】
  3. 机器视觉图像采集卡的功能与应用
  4. 经验 | 机器学习要避开十大雷区
  5. 7个最佳的学习Python编程的开源库
  6. 链表问题15——将搜索二叉树转换成双向链表
  7. Java知识点总结(JavaIO-合并流类)
  8. 统一沟通-技巧-10-Lync-公网证书-Go Daddy
  9. Android -- View移动的六种方法
  10. 使用MSBuild实现完整daily build流程