题目大意

有n个从1..n标号的座位,按时间顺序给出每个客人来的时候是坐在第几个空座位,最后给若干个询问问第i号客人坐在哪里

分析

线段树+二分

  1. // Fast Sequence Operations II
  2. // Rujia Liu
  3. // 输入格式:
  4. // n m 数组范围是a[1]~a[n],初始化为0。操作有m个
  5. // 1 L R v 表示设a[L]=a[L+1]=...=a[R] = v。其中v > 0
  6. // 2 L R 查询a[L]~a[R]的sum, min和max
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<algorithm>
  10. using namespace std;
  11.  
  12. const int maxnode = <<;
  13.  
  14. int _sum, _min, _max, op, qL, qR, v;
  15. int vist[maxnode];
  16. struct IntervalTree {
  17. int sumv[maxnode], minv[maxnode], maxv[maxnode], setv[maxnode];
  18.  
  19. // 维护信息
  20. void maintain(int o, int L, int R) {
  21. int lc = o*, rc = o*+;
  22. if(R > L) {
  23. sumv[o] = sumv[lc] + sumv[rc];
  24. minv[o] = min(minv[lc], minv[rc]);
  25. maxv[o] = max(maxv[lc], maxv[rc]);
  26. }
  27. if(setv[o] >= ) { minv[o] = maxv[o] = setv[o]; sumv[o] = setv[o] * (R-L+); }
  28. }
  29.  
  30. // 标记传递
  31. void pushdown(int o) {
  32. int lc = o*, rc = o*+;
  33. if(setv[o] >= ) { //本结点有标记才传递。注意本题中set值非负,所以-1代表没有标记
  34. setv[lc] = setv[rc] = setv[o];
  35. setv[o] = -; // 清除本结点标记
  36. }
  37. }
  38.  
  39. void update(int o, int L, int R) {
  40. int lc = o*, rc = o*+;
  41. if(qL <= L && qR >= R) { // 标记修改
  42. setv[o] = v;
  43. } else {
  44. pushdown(o);
  45. int M = L + (R-L)/;
  46. if(qL <= M) update(lc, L, M); else maintain(lc, L, M);
  47. if(qR > M) update(rc, M+, R); else maintain(rc, M+, R);
  48. }
  49. maintain(o, L, R);
  50. }
  51.  
  52. void query(int o, int L, int R) {
  53. if(setv[o] >= ) { // 递归边界1:有set标记
  54. _sum += setv[o] * (min(R,qR)-max(L,qL)+);
  55. _min = min(_min, setv[o]);
  56. _max = max(_max, setv[o]);
  57. } else if(qL <= L && qR >= R) { // 递归边界2:边界区间
  58. _sum += sumv[o]; // 此边界区间没有被任何set操作影响
  59. _min = min(_min, minv[o]);
  60. _max = max(_max, maxv[o]);
  61. } else { // 递归统计
  62. int M = L + (R-L)/;
  63. if(qL <= M) query(o*, L, M);
  64. if(qR > M) query(o*+, M+, R);
  65. }
  66. }
  67. };
  68.  
  69. const int INF = ;
  70.  
  71. IntervalTree tree;
  72.  
  73. int main() {
  74. int n, m,num;
  75. while(scanf("%d", &n) !=EOF){
  76. memset(&tree, , sizeof(tree));
  77. memset(tree.setv, -, sizeof(tree.setv));
  78. tree.setv[] = ;
  79. v=;
  80. qL=;
  81. qR=n;
  82. tree.update(,,n);
  83. tree.query(,,n);
  84. for(int i=;i<=n;i++)
  85. {
  86. scanf("%d",&num);
  87. qL=;qR=n;
  88. _sum = ;
  89. int l=,r=n,mid;
  90. while(l<r)
  91. {
  92. mid=(l+r)/;
  93. qR=mid;
  94. tree.query(, , n);
  95. if(_sum>=num)
  96. r=mid;
  97. else
  98. l=mid+;
  99. _sum = ;
  100. }
  101. vist[i]=l;
  102. v=;
  103. qL=l;
  104. qR=l;
  105. tree.update(,,n);
  106. }
  107. scanf("%d",&m);
  108. for(int i=;i<=m;i++)
  109. {
  110. scanf("%d",&num);
  111. printf("%d",vist[num]);
  112. if(i!=m)
  113. printf(" ");
  114.  
  115. }
  116. printf("\n");
  117. }
  118. return ;
  119. }

ZOJ Problem Set - 3635的更多相关文章

  1. ZOJ Problem Set - 1394 Polar Explorer

    这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...

  2. ZOJ Problem Set - 1025解题报告

    ZOJ Problem Set - 1025 题目分类:基础题 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=10 ...

  3. ZOJ Problem Set - 3829Known Notation(贪心)

    ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...

  4. ZOJ Problem Set - 2563 Long Dominoes 【如压力dp】

    称号:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形.求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的.比較火.链接:这里 ...

  5. ZOJ Problem Set - 3593 拓展欧几里得 数学

    ZOJ Problem Set - 3593 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593 One Person ...

  6. ZOJ Problem Set - 2297 Survival 【状压dp】

    题目:ZOJ Problem Set - 2297 Survival 题意:给出一些怪,有两个值,打他花费的血和能够添加的血,然后有一个boss,必须把小怪全部都打死之后才干打boss,血量小于0会死 ...

  7. ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

    题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题 ...

  8. ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】

    题目:problemId=3442" target="_blank">ZOJ Problem Set - 3229 Shoot the Bullet 分类:有源有汇 ...

  9. ZOJ Problem Set - 3822Domination(DP)

    ZOJ Problem Set - 3822Domination(DP) problemCode=3822">题目链接 题目大意: 给你一个n * m的棋盘,每天都在棋盘上面放一颗棋子 ...

随机推荐

  1. wordpress 中禁止更新提示

    前言: 在此之前每每打开blog的时候总是有那么个数字在那边显示,如果是很重要的更新显示在那也就算了,有时候就算一个破主题他还一直在那边,很是让小猪纠结.最关键的是要是更新了主题,那么之前所有自定义的 ...

  2. ssh localhost “Permission denied (publickey)

    再次遇到 SSH Server And "Permission denied (publickey) 用这个关键词搜索才找到howtogeek上答案: sshd : Authenticati ...

  3. list集合的遍历3种方法

    package com.sort; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** ...

  4. Hibernate 错误处理

    1. 在处理映射 1 对 n 时,Customer类为 1, Order类为 n,对象关系映射文件中没有错误,<many to one> 也正确,表名通类名. 但是,在执行插入时,发生两个 ...

  5. wp8.1 Study7: ListView 和GridView应用

    对于列表控件,WP8.1常用的是ListView.GridView.ListBox控件.其中前两个是从第三个继承来的. 1.ListView控件 它是展示垂直列表的,如下图所示.它十分适合展示数据. ...

  6. Windows平台下的读写锁

    Windows平台下的读写锁简单介绍Windows平台下的读写锁以及实现.背景介绍Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(Initialize ...

  7. Bootstrap非常简单实用的web前端开发框架

    今天无意间用firebug看网站的代码发现了Bootstrap,之前从来没有听说过这个东东,于是对它产生了好奇感,通过百度我了解到了Bootstrap是一款非常简单,强悍,实用,移动设备端优先使用的这 ...

  8. Volatile vs VolatileRead/Write?

    You should never use Thread.VolatileRead/Write(). It was a design mistake in .NET 1.1, it uses a ful ...

  9. JDK的下载与安装

    一.下载 在Oracle公司的官方网站(www.oracle.com)下载. 二.安装 1.双击运行JDK程序,弹出JDK安装导向窗口,点击“下一步” 2.点击“更改",将安装地址修改为 C ...

  10. (转)HTML文档头部信息

    原文:http://www.cnblogs.com/sunyunh/archive/2012/07/25/2609199.html HTML(3)HTML文档头部信息   <!DOCTYPE h ...