中文题面

思路:维和两个区间  一个是女神区间 一个是基友区间  如果是基友要预约时间 直接在基友区间查询可满足的起点 (这里先判tree[1].m >=length也就是有没有这样的区间满足时间length) 预约成功后更新基友区间

如果是女神要预约区间 先在基友区间预约看有没有满足的区间 (同样看根节点的m) 如果有 同时更新两个区间 如果没有继续在女神区间查找 如果女神区间有 则同时更新基友和女神区间 如果没有 那就真没有了直接输出 题目要求的话

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e6+;
  4. struct Node{
  5. int l,r;
  6. int ml,mr,m;
  7. }tree1[maxn*],tree2[maxn*];
  8. void build(int x,int l,int r){
  9. tree1[x].l=tree2[x].l=l;
  10. tree1[x].r=tree2[x].r=r;
  11. tree1[x].ml=tree2[x].ml=tree1[x].mr=tree2[x].mr=tree1[x].m=tree2[x].m=r-l+;
  12. if(l==r)return ;
  13. int mid=l+r>>;
  14. build(x<<,l,mid);
  15. build(x<<|,mid+,r);
  16. }
  17. void push_up(int x){
  18. int mid=tree1[x].r+tree1[x].l>>;
  19. tree1[x].ml=tree1[x<<].ml;
  20. tree1[x].mr=tree1[x<<|].mr;
  21. tree1[x].m=max(max(tree1[x<<].m,tree1[x<<|].m),tree1[x<<].mr+tree1[x<<|].ml);
  22. if(tree1[x<<].ml==mid-tree1[x].l+)tree1[x].ml+=tree1[x<<|].ml;
  23. if(tree1[x<<|].mr==tree1[x].r-mid)tree1[x].mr+=tree1[x<<].mr;
  24.  
  25. tree2[x].ml=tree2[x<<].ml;
  26. tree2[x].mr=tree2[x<<|].mr;
  27. tree2[x].m=max(max(tree2[x<<].m,tree2[x<<|].m),tree2[x<<].mr+tree2[x<<|].ml);
  28. if(tree2[x<<].ml==mid-tree2[x].l+)tree2[x].ml+=tree2[x<<|].ml;
  29. if(tree2[x<<|].mr==tree2[x].r-mid)tree2[x].mr+=tree2[x<<].mr;
  30.  
  31. }
  32. void push_down(int x){
  33. int mid=tree1[x].l+tree1[x].r>>;
  34. if(tree1[x].m==tree1[x].r-tree1[x].l+){
  35. tree1[x<<].ml=tree1[x<<].mr=tree1[x<<].m=mid-tree1[x].l+;
  36. tree1[x<<|].ml=tree1[x<<|].mr=tree1[x<<|].m=tree1[x].r-mid;
  37. }
  38. else if(tree1[x].m==){
  39. tree1[x<<].ml=tree1[x<<].mr=tree1[x<<].m=;
  40. tree1[x<<|].ml=tree1[x<<|].mr=tree1[x<<|].m=;
  41. }
  42.  
  43. if(tree2[x].m==tree2[x].r-tree2[x].l+){
  44. tree2[x<<].ml=tree2[x<<].mr=tree2[x<<].m=mid-tree2[x].l+;
  45. tree2[x<<|].mr=tree2[x<<|].ml=tree2[x<<|].m=tree2[x].r-mid;
  46. }
  47. else if(tree2[x].m==){
  48. tree2[x<<].ml=tree2[x<<].mr=tree2[x<<].m=;
  49. tree2[x<<|].mr=tree2[x<<|].ml=tree2[x<<|].m=;
  50. }
  51. }
  52. void update(int x,int l,int r,int value){
  53. if(tree1[x].l>=l&&tree1[x].r<=r){
  54. if(value==){
  55. tree1[x].ml=tree1[x].mr=tree1[x].m=;
  56. }
  57. else if(value==){
  58. tree1[x].ml=tree1[x].mr=tree1[x].m=;
  59. tree2[x].ml=tree2[x].mr=tree2[x].m=;
  60. }
  61. else {
  62. tree1[x].ml=tree1[x].mr=tree1[x].m=tree1[x].r-tree1[x].l+;
  63. tree2[x].ml=tree2[x].mr=tree2[x].m=tree1[x].r-tree1[x].l+;
  64. }
  65. return ;
  66. }
  67. int mid=tree1[x].l+tree1[x].r>>;
  68. push_down(x);
  69. if(mid>=l)update(x<<,l,r,value);
  70. if(mid<r)update(x<<|,l,r,value);
  71. push_up(x);
  72. }
  73. int query(int x,int length,int value){
  74. if(tree1[x].l==tree1[x].r)return tree1[x].l;
  75. push_down(x);
  76. int mid=tree1[x].l+tree1[x].r>>;
  77. if(value==){
  78. if(tree1[x<<].m>=length){
  79. return query(x<<,length,value);
  80. }
  81. else if(tree1[x<<].mr+tree1[x<<|].ml>=length){
  82. return mid-tree1[x<<].mr+;
  83. }
  84. else return query(x<<|,length,value);
  85. }
  86. else {
  87. if(tree2[x<<].m>=length){
  88. return query(x<<,length,value);
  89. }
  90. else if(tree2[x<<].mr+tree2[x<<|].ml>=length){
  91. return mid-tree2[x<<].mr+;
  92. }
  93. else return query(x<<|,length,value);
  94. }
  95. }
  96. int main(){
  97. int t;
  98. int kase=;
  99. scanf("%d",&t);
  100. char s[];
  101. int temp;
  102. int q;
  103. int n;
  104. while(t--){
  105. printf("Case %d:\n",kase++);
  106. scanf("%d%d",&n,&q);
  107. build(,,n);
  108. while(q--){
  109. scanf("%s%d",s,&temp);
  110. if(s[]=='D'){
  111. if(tree1[].m>=temp){
  112. int start=query(,temp,);
  113. update(,start,start+temp-,);
  114. printf("%d,let's fly\n",start);
  115. }
  116. else printf("fly with yourself\n");
  117. }
  118. else if(s[]=='N'){
  119. if(tree1[].m>=temp){
  120. int start=query(,temp,);
  121. update(,start,start+temp-,);
  122. printf("%d,don't put my gezi\n",start);
  123. }
  124. else if(tree2[].m>=temp){
  125. int start=query(,temp,);
  126. update(,start,start+temp-,);
  127. printf("%d,don't put my gezi\n",start);
  128. }
  129. else printf("wait for me\n");
  130. }
  131. else {
  132. int zz;
  133. scanf("%d",&zz);
  134. update(,temp,zz,);
  135. printf("I am the hope of chinese chengxuyuan!!\n");
  136. }
  137. }
  138.  
  139. }
  140. return ;
  141. }

M - 约会安排 HDU - 4553 线段树 (最长连续段)的更多相关文章

  1. HDU 3308 线段树 最长连续上升子序列 单点更新 区间查询

    题意: T个测试数据 n个数 q个查询 n个数 ( 下标从0开始) Q u v 查询 [u, v ] 区间最长连续上升子序列 U u v 把u位置改成v #include<iostream> ...

  2. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  3. 约会安排HDU - 4553

    寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基 ...

  4. 约会安排---hdu4553(线段树,麻烦的区间覆盖)

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4553 算是poj3667的加强版,建立两颗线段树,一个是DS区间,另一个是NS区间.那么根据题意, ...

  5. 约会安排 HDU - 4553(线段树区间查询,区间修改,区间合并)

    题目: 寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑, ...

  6. M - 约会安排 - hdu 4553

    寒假来了,又到了小明和女神们约会的季节.  小明虽为�丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量 ...

  7. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  8. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

随机推荐

  1. portscaner 多线程、多协程并发端口扫描

    import socket,time,re,sys,os,threading import gevent from gevent import monkey monkey.patch_all() so ...

  2. 如何在Github中删除已有仓库或文件

    一.删除已有仓库如果我们想要删除Github中没有用的仓库,应该如何去做呢? 进入到我们需要删除的仓库里面,找到“settings”即仓库设置: 然后,在仓库设置里拉到最底部,找到“Danger Zo ...

  3. ASP.NET项目开发

    ASP.NET项目开发 1.C/S模式 (client 客户端 server 服务器):QQ.证券.酷狗.旺旺...需要下载响应软件: 工作原理:客户端请求--ASP.net服务器端应用(<-- ...

  4. Makes And The Product CodeForces - 817B (思维+构造)

    B. Makes And The Product time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  6. hibernate 的sum(filed)引发的NullPointException错误解决过程

    背景: 在用hql语句进行sum查询时遭遇NPE问题: StringBuilder builder = new StringBuilder("select SUM(actualWorking ...

  7. jmeter高并发设计方案(转)

    高并发设计方案二(秒杀架构) 优化方向: (1)将请求尽量拦截在系统上游(不要让锁冲突落到数据库上去).传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超 ...

  8. java从request中获取GET和POST请求参数

    URL和参数列表 一 获取请求方式 request.getMethod(); get和post都可用, 二 获取请求类型 request.getContentType(); get和post都可用,示 ...

  9. MyBaits全局配置文件的各项标签1

    ■dtd约束     <!DOCTYPE configuration           PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ...

  10. MongoDB操作(1)—MongoDB java驱动核心层次结构及操作流程

    MongoDB之java驱动学习 预备: 本地运行MongoDB采用默认端口20717: 安装MongoDB驱动: 以下关键步骤. 核心层次结构或步骤: 创建连接池:MongoClient实例. 对于 ...