题意:

给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数;

最后输出1~n的权值


题解:

首先可以发现,最后一次插入的位置是准确的位置

所以这个就变成了若干个子问题,

所以用线段树维护一下每个区间剩余多少位置可选

对于一个pos

如果左儿子的剩余超过当前位置,就递归进左子树

反之就相当于留出了左儿子剩余的位置,递归进右子树,当前位置变成pos-左儿子剩余位置

请注意是在后面插入

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 typedef long long ll;
 5 #define N 200010
 6 using namespace std;
 7 struct node
 8 {
 9     ll l,r,sum,w;
10 }t[4*N];
11 ll p[N],w[N];
12 ll read()
13 {
14     ll ret=0,neg=1;
15     char j=getchar();
16     for (;j>'9' || j<'0';j=getchar())
17     if (j=='-') neg=-1;
18     for (;j<='9' && j>='0';j=getchar())
19     ret=ret*10+j-'0';
20     return ret*neg;
21 }
22 ll n,q,l,r,k,ans[N];
23 void pushup(ll p)
24 {
25     t[p].sum=t[2*p].sum+t[2*p+1].sum;
26 }
27 void build(ll p,ll l,ll r)
28 {
29     t[p].l=l,t[p].r=r;
30     if (l!=r)
31     {
32     ll mid=l+r>>1;
33     build(2*p,l,mid);
34     build(2*p+1,mid+1,r);
35     pushup(p);
36     }
37     else
38     t[p].sum=1;
39 }
40 void modify(ll p,ll pos,ll k)
41 {
42     if (t[p].l==t[p].r)
43     {
44     ans[t[p].l]=k;
45     t[p].sum--;
46     return ;
47     }
48     if (t[2*p].sum>=pos) modify(2*p,pos,k);
49     else modify(2*p+1,pos-t[2*p].sum,k);
50     pushup(p);
51 }
52 int main()
53 {
54     while (scanf("%lld",&n)!=EOF)
55     {
56     build(1,1,n);
57     for (int i=1;i<=n;i++)
58         p[i]=read(),w[i]=read();
59     for (int i=n;i>=1;i--)
60         modify(1,p[i]+1,w[i]);
61     for (int i=1;i<=n;i++)
62         printf("%lld%c",ans[i]," \n"[i==n]);
63     }
64     return 0;
65 }

转载于:https://www.cnblogs.com/mrsheep/p/7866681.html

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

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

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

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

  5. POJ 2828. Buy Tickets

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

  6. 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)

    http://poj.org/problem?id=2828 一开始敲了个splay,直接模拟. tle了.. 常数太大.. 好吧,说是用线段树.. 而且思想很拽.. (貌似很久以前写过貌似的,,) ...

  7. POJ 3667 Hotel(线段树)

    POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...

  8. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

  9. poj/OpenJ_Bailian - 2528 离散化+线段树

    传送门:http://bailian.openjudge.cn/practice/2528?lang=en_US //http://poj.org/problem?id=2528 题意: 给你n长海报 ...

最新文章

  1. python小游戏代码大全-python小游戏实现代码
  2. Computer Organization and Design--计组作业习题(1)
  3. 松下SW-9585-C全功能DVD刻录机 狂降100+享受专业刻录!
  4. jms message组成和jsm selector详解(二)
  5. Java的代码书写规范
  6. 如果你人生的第一目标是赚钱
  7. SQL Server 2008数据库快照技术(八)
  8. Servlet教程第4讲笔记
  9. JS动态添加Html
  10. 电子工程师12个忠告,新手老鸟都值得一看!
  11. docker 中使用nginx容器无法正常启动,报错signal process started和kili(3255,1) failed (3: No such process)
  12. 判断一个数是否为完全数
  13. android 您的手机上未安装应用程序的解决方法
  14. React部署到 Tomcat上 使用 BrowserRouter不能刷新404的问题
  15. 08年底杭州东站买票记
  16. CAD主流电气原理图,通俗易懂,合适工控爱好者学习
  17. PHP语言:微信开放平台PC端扫码登录
  18. java二次开发流程,源码修改流程(Hadoop)
  19. dfss覆盖度的特围
  20. ION-DTN设计约束

热门文章

  1. IDP申请直到软件上架流程 - iOS
  2. cocos2d-x android 移植 问题
  3. 那些值得回味的MySQL的基础知识
  4. 一个mongosee例子
  5. SetGet and MACRO
  6. TWAIN Specification Chapter 4 “Advanced Application Implementation”译——应用程序端的高级实现...
  7. 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
  8. c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法
  9. 企业不要求工程师资格认证_谁说工程师不能成为企业家?
  10. android surface 平板,Surface平板能升级安卓4.0吗