http://poj.org/problem?id=2828

插队问题,n个人,下面n行每行a,b表示这个人插在第a个人的后面和这个人的编号为b,最后输出队伍的情况

涉及到节点的问题可以用到线段树,这里因为每个人插队时有顺序的,如果按照正着的顺序来情况太复杂,所以可以试试倒过来,从最后一个人开始,此时找到的位置

一定是最终位置,这样就很简单了,   结构体中多开一个mark表示每个区间的空位置,多开一个sum表示人的编号

这道题不错,提醒我们有时候换一换思路,逆向思考一下

  1. #include<cstdio>
  2. using namespace std;
  3. struct point {
  4. int l,r;
  5. int sum,mark;
  6. };
  7. point tree[*];
  8. int a[],b[];
  9. void build(int i,int left,int right)
  10. {
  11. tree[i].l=left,tree[i].r=right;
  12. tree[i].mark=(tree[i].r-tree[i].l)+;
  13. tree[i].sum=;
  14. if (right==left) return;
  15. int mid=(left+right)/;
  16. build(i*,left,mid);
  17. build(i*+,mid+,right);
  18. }
  19. void update(int i,int pos,int val)
  20. {
  21. if (tree[i].l==tree[i].r)
  22. {
  23. tree[i].sum=val;
  24. tree[i].mark--;
  25. return ;
  26. }
  27. if (pos<=tree[i*].mark)
  28. update(i*,pos,val);
  29. else
  30. update(i*+,pos-tree[i*].mark,val);
  31. tree[i].mark=tree[i*].mark+tree[i*+].mark; //更新区间的空位
  32. }
  33. void check(int i)
  34. {
  35. if (tree[i].l==tree[i].r)
  36. {
  37. printf("%d ",tree[i].sum);
  38. return ;
  39. }
  40. check(i*);
  41. check(i*+);
  42. }
  43. int main()
  44. {
  45. int n,i;
  46. while (~scanf("%d",&n))
  47. {
  48. for (i=;i<=n;i++)
  49. scanf("%d %d",&a[i],&b[i]);
  50. build(,,n);
  51. for (i=n;i>;i--)
  52. update(,a[i]+,b[i]);
  53. check();
  54. printf("\n");
  55. }
  56. return ;
  57. }

poj 2828(线段树 逆向思考) 插队是不好的行为的更多相关文章

  1. poj 2828 线段树

    http://poj.org/problem?id=2828 学到的思维: 1.变化的或者后来的优先影响前面的,那么从最后一个往前看,最后一个就成了 确定的, 而且后来的也能够确定----假设从前往后 ...

  2. poj 2828(线段树单点更新)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 18561   Accepted: 9209 Desc ...

  3. POJ 2828 线段树(想法)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15422   Accepted: 7684 Desc ...

  4. POJ 2828 线段树活用

    题目大意:依次描述了一个N个人的队伍,每个人所站的序号以及他的价值,依次描述每个人的过程中,存在序号相同的人,表示该人插入到了前一个序号相同的人的前面.最后输出整个队伍的值排列情况. 这个题目确实难以 ...

  5. POJ 2828 (线段树 单点更新) Buy Tickets

    倒着插,倒着插,这道题是倒着插! 想一下如果 Posi 里面有若干个0,那么排在最前面的一定是最后一个0. 从后往前看,对于第i个数,就应该插在第Posi + 1个空位上,所以用线段树来维护区间空位的 ...

  6. POJ 2828 线段树 逆序插入

    思路: 1.线段树 逆着插入就OK了 2.块状链表 (可是我并不会写) //By SiriusRen #include <cstdio> #include <cstring> ...

  7. POJ 2828 线段树单点更新 离线搞

    Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...

  8. poj 2886 线段树+反素数

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12744   Acc ...

  9. poj 2886 (线段树+反素数打表) Who Gets the Most Candies?

    http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...

随机推荐

  1. 初探 objc_msgSend函数

    1.0 执行某个对象的方法    [receiver message] 被编译为: id objc_msgSend(id self,SEL op,...): objc_msgSend 发送信息的过程 ...

  2. Ubuntu Spark 环境搭建(转)

    在安装Spark之前,我们需要在自己的系统当中先安装上jdk和scala 可以去相应的官网上下载: JDK:http://www.oracle.com/technetwork/java/javase/ ...

  3. js高级-原型链

    JavaScript是基于原型的面向对象的语言(相当于一个基类,父类),而不是像Java通过类模板构造实例,通过原型实现属性函数的复用 函数都有 prototype属性 指向函数的原型对象 只有函数根 ...

  4. php yii 命令

    php yii 敲回车 This is Yii version 2.0.11. The following commands are available: - asset Allows you to ...

  5. c 中的单引号和双引号的使用

    1. 在c中,'A' 表示的是一个 character constant ,表示的是字符集的数值:而 "A" 表示的是一个字符串常量,代表的是指向字符串的指针.

  6. PowerDesigner导入sql脚本生成物理模型

    https://www.cnblogs.com/zsswpb/p/5771623.html

  7. svn 更新lib库时,报错

    svn: E195012: Unable to find repository location for svn:// in revision 9718 Can't revert without re ...

  8. 项目没有build path问题(转)

    感谢作者分享:https://blog.csdn.net/u012572815/article/details/76353018 问题1.通过eclipse的svn资源库添加的项目,显示的方式和直接创 ...

  9. pandas的日常笔记--查询

  10. tomcat指向外部项目

    参考 https://www.cnblogs.com/ysocean/p/6893446.html conf/server.xml中增加 <Context path="/myweb&q ...