题目传送门

前置知识

线段树

解法

第一眼感觉和 luogu P1083 [NOIP2012 提高组] 借教室 很像。本题同样采用线段树维护,\(sum_{l,r}(1 \le l \le r \le 10^6)\) 表示从 \(l \sim r\) 时刻内骑士拜访的总时间,\(maxx_{l,r}(1 \le l \le r \le 10^6)\) 表示从 \(l \sim r\) 时刻内骑士拜访完的最后时间。

build 函数和普通线段树一样。

update 函数和普通单点修改一样。

pushup 函数是本题一个难点。考虑对于从 \(l \sim r(1 \le l \le r \le 10^6)\) 时刻,如果左区间 \(l \sim mid\) 时刻骑士拜访完的最后时间大于右区间 \(mid+1 \sim r\) 时刻的起始点,则右区间 \(mid+1 \sim r\) 时刻内所有骑士拜访均要向后推迟,即 tree[rt].maxx=max(tree[lson(rt)].maxx+tree[rson(rt)].sum,tree[rson(rt)].maxx);

query 函数同理,查询时需要额外记录左区间 \(l \sim mid\) 时刻骑士拜访完的最后时间,对于最终时间时需要取 \(\max\),即 max(tree[rt].maxx,tree[rt].sum+maxxx);。最终答案即为最终时间减去起始拜访时间。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long//本题需要开 long long
  4. #define sort stable_sort
  5. #define endl '\n'
  6. ll t[400000],d[400000],ans=0;
  7. struct SegmentTree
  8. {
  9. ll l,r,sum,maxx;
  10. }tree[5000000];
  11. ll lson(ll x)
  12. {
  13. return x*2;
  14. }
  15. ll rson(ll x)
  16. {
  17. return x*2+1;
  18. }
  19. void pushup(ll rt)
  20. {
  21. tree[rt].sum=tree[lson(rt)].sum+tree[rson(rt)].sum;
  22. tree[rt].maxx=max(tree[lson(rt)].maxx+tree[rson(rt)].sum,tree[rson(rt)].maxx);
  23. }
  24. void build(ll rt,ll l,ll r)
  25. {
  26. tree[rt].l=l;
  27. tree[rt].r=r;
  28. if(l==r)
  29. {
  30. tree[rt].maxx=tree[rt].sum=0;
  31. return;
  32. }
  33. ll mid=(l+r)/2;
  34. build(lson(rt),l,mid);
  35. build(rson(rt),mid+1,r);
  36. pushup(rt);
  37. }
  38. void update(ll rt,ll pos,ll val)
  39. {
  40. if(tree[rt].l==tree[rt].r)
  41. {
  42. tree[rt].sum=val;
  43. tree[rt].maxx=tree[rt].l+val;
  44. return;
  45. }
  46. else
  47. {
  48. ll mid=(tree[rt].l+tree[rt].r)/2;
  49. if(pos<=mid)
  50. {
  51. update(lson(rt),pos,val);
  52. }
  53. else
  54. {
  55. update(rson(rt),pos,val);
  56. }
  57. }
  58. pushup(rt);
  59. }
  60. ll query(ll rt,ll l,ll r,ll maxxx)
  61. {
  62. if(l<=tree[rt].l&&tree[rt].r<=r)
  63. {
  64. return max(tree[rt].maxx,tree[rt].sum+maxxx);
  65. }
  66. else
  67. {
  68. ll mid=(tree[rt].l+tree[rt].r)/2;
  69. if(l<=mid)
  70. {
  71. ans=max(ans,query(lson(rt),l,r,maxxx));
  72. }
  73. if(mid<r)
  74. {
  75. ans=max(ans,query(rson(rt),l,r,ans));
  76. }
  77. return ans;
  78. }
  79. }
  80. int main()
  81. {
  82. ll q,n,i,val;
  83. char pd;
  84. cin>>q;
  85. build(1,1,1000000);
  86. for(i=1;i<=q;i++)
  87. {
  88. cin>>pd;
  89. if(pd=='+')
  90. {
  91. cin>>t[i]>>d[i];
  92. update(1,t[i],d[i]);//因为第i位骑士访谈的时间是t[i]到t[i]+d[i]
  93. }
  94. if(pd=='-')
  95. {
  96. cin>>val;
  97. update(1,t[val],0);
  98. }
  99. if(pd=='?')
  100. {
  101. cin>>val;
  102. ans=0;
  103. cout<<max(0ll,query(1,1,val,ans)-val)<<endl;
  104. }
  105. }
  106. return 0;
  107. }

后记

双倍经验:P9801 | CF1089K

CF1089K King Kog's Reception 题解的更多相关文章

  1. Codeforces 1089K - King Kog's Reception - [线段树][2018-2019 ICPC, NEERC, Northern Eurasia Finals Problem K]

    题目链接:https://codeforces.com/contest/1089/problem/K time limit per test: 2 seconds memory limit per t ...

  2. 2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution

    A. Alice the Fan Solved. 题意: 两个人打网球,要求teamA 的得分与其他队伍拉开尽量大 输出合法的方案 思路: $dp[i][j][k][l] 表示 A 赢i局,其他队伍赢 ...

  3. Codeforces Round #379 (Div. 2) A B C D 水 二分 模拟

    A. Anton and Danik time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  4. Money King【题解】

    我又傻了……竟然忘了区别大根堆和小根堆的性质,以至于一个符号打错,debug了半天……(我真是太菜了……) 题目描述 Once in a forest, there lived N aggressiv ...

  5. POJ 1904 King's Quest(强连通图)题解

    题意:n个王子有自己喜欢的ki个公主,有n个公主,每个王子只能娶一个自己喜欢的公主且不能绿别的王子.现在给你一种王子娶公主的方案,并且保证这种方案是正确的.请你给出,每个王子能娶哪些公主,要求娶这些公 ...

  6. POJ2728:Desert King——题解

    http://poj.org/problem?id=2728 题目大意:求一棵生成树使得路费用和/路长之和最小(路的费用是两端点的高度差) 最小比率生成树. 我们还是01分数规划的思想将边权变为路费用 ...

  7. 【luogu P1456 Monkey King】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1456 左偏树并查集不加路径压缩吧... #include <cstdio> #include & ...

  8. LuoguP7041 [NWRRC2016]King's Heir 题解

    Content 给出现在的日期,请从 \(n\) 个人当中选出一个人,使得他是所有成年人(\(\geqslant 18\) 岁的人)中年龄最小的. 数据范围:设日期为 \(yy/mm/dd\),则有 ...

  9. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

  10. [Educational Codeforces Round 16]A. King Moves

    [Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board ...

随机推荐

  1. KVM 核心功能:CPU 虚拟化

    1 vCPU 简介 CPU 负责计算机程序指令的执行.QEMU-KVM 提供对虚拟机 CPU 的模拟,对于虚拟机来说,其拥有的 CPU 是真实的, 和物理 CPU 没有区别. 实际上,虚拟机在 hos ...

  2. RL 的探索策略 | Exploration for RL

    最近在草率地调研 RL 的 exploration. 这篇文章也比较草率,仅能起到辅助作用,不能代替读 review 或更精细的读 paper. 目录 0 总结写在最前面 1 主要参考资料 2 RL ...

  3. Elastic学习之旅 (2) 快速安装ELK

    大家好,我是Edison. 上一篇:初识ElasticSearch ElasticSearch的安装方式 ElasticSearch可以有多种安装方式,比如直接下载安装到宿主机进行运行,也可以通过do ...

  4. [转帖]Oracle与防火墙

    https://www.laoxiong.net/oracle_and_firewall.html 老熊 Oracle数据库管理 2009-04-20 最近有两次Oracle数据库故障与防火墙有关.这 ...

  5. [转帖]docker(一):docker pull指定运行平台架构

    https://zhuanlan.zhihu.com/p/539888862 1.概述 大家好,我是欧阳方超.某日要在服务器上部署docker服务,其中要用到nginx,nginx经过pull.sav ...

  6. 快速迁移Grafana/Prometheus等的方式方法

    快速迁移Grafana/Prometheus等的方式方法 背景 有一套鲲鹏环境下面的Grafana监控平台. 同事想能够将平台内的时序数据库等迁移到一个别的机器上进行使用. 自从自己开始搞国产化之后, ...

  7. [转帖]Oracle参数解析(parallel_force_local)

    https://www.modb.pro/db/122032 是否需要增加这个参数? 往期专题请查看www.zhaibibei.cn这是一个坚持Oracle,Python,MySQL原创内容的公众号 ...

  8. [转帖]TiDB损坏多副本之有损恢复处理方法

    https://tidb.net/blog/b1ae4ee7   TiDB分布式数据库采用多副本机制,数据副本通过 Multi-Raft 协议同步事务日志,确保数据强一致性且少数副本发生故障时不影响数 ...

  9. 虚拟化平台IO劣化分析

    虚拟化平台IO劣化分析 背景 最近同事让帮忙做几个虚拟机进行性能测试. 本来应该搭建CentOS/Winodws平台进行相关的测试工作. 但是为了环境一致性, 使用了ESXi6.7 进行虚拟化 然后这 ...

  10. 银河麒麟不同架构获取rpm包的方法

    银河麒麟不同架构获取rpm包的方法 背景 随着信创和网络安全越来越重要 现阶段国产化的软硬件部署越来越多. 很多时候现场有很多国产化的设备.不同架构.不同版本. 还不能上网, 无法获取对应的安装介质. ...