我们先考虑一下拿部分分:

subtask1

考虑因为 \(n < 2k\) ,那么我们的划分一定是从中间某个地方裁开,且满足 \(k\) 的条件的,我们发现当划分点在 \([n\ mod\ k,k]\)时满足条件,那么我们只需要维护一个前缀最大值和后缀最大值就好了。

  1. for(int i = 1;i <= n;++i)
  2. pre[i] = std::max(pre[i - 1],a[i]);
  3. for(int i = n;i >= 1;--i)
  4. s[i] = std::max(s[i + 1],a[i]);
  5. ll ans = 0;
  6. for(int i = n % k ;i <= k;++i)
  7. ans = std::max(ans,1ll * pre[i] + s[i + 1]);
  8. std::cout<<ans<<std::endl;

subtask2

我们发现这一档的分的关键是 \(k\) 很小,那么我们先轻松就能想到一个朴素的 \(dp\) ,我们设 \(f_i\) 为以 \(i\) 处为结尾的划分的答案最大值。为了满足转移次数最小,我们每次转移都要附上一个较大的代价 \(INF\) 。

所以转移方程为 \(f_i = max_{j = max(0,i - k + 1)}(f_j + p(j + 1,i)) - INF,p(x,y) = max_{i = x} ^ y a_i\) 。

最后我们发现转移次数我们是可以计算出来的,我们为 \(f_n\) 加上 \(\lfloor\frac{n}{k}\rfloor + [n \ mod\ k > 0] * INF\) 就好了。

  1. for(int i = 1;i <= n;++i)
  2. f[i] = -9e18;
  3. // std::cout<<f[0]<<std::endl;
  4. for(int i = 1;i <= n;++i){
  5. ll ma = a[i];
  6. ll m = std::max((ll)0,i - k + 1);
  7. f[0] = 0;
  8. for(int j = i;j >= m;--j){
  9. ma = std::max(a[j],ma);
  10. f[i] = std::max(1ll * f[j - 1] + ma - INF,f[i]);
  11. }
  12. // std::cout<<f[i] + (i / k + (i % k > 0)) * INF<<std::endl;
  13. }
  14. std::cout<<1ll * f[n] + 1ll * (n / k + (n % k > 0)) * INF<<std::endl;

all subtask

我们考虑 \(p(x,y)\) 是一个较难处理的点,我们可以使用单调栈来处理他。

即我们依次向右扩展当前节点,并维护最大值的阶段。

我们需要一个可以处理区间修改,区间查询最大值的数据结构,线段树。

但是要注意一个最大值区间所对应的贡献区间要向左移一位。

  1. // Problem: P6647 [CCC 2019] Tourism
  2. // Contest: Luogu
  3. // URL: https://www.luogu.com.cn/problem/P6647
  4. // Memory Limit: 128 MB
  5. // Time Limit: 4000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<cstring>
  11. #define ll long long
  12. #define N 1000005
  13. const ll INF = 1e12;
  14. ll n,k;
  15. int a[N];
  16. ll f[N];
  17. struct seg{int l,r;ll v,tag;}t[N * 6];
  18. ll st[N],tp;
  19. #define ls(x) (x << 1)
  20. #define rs(x) (x << 1 | 1)
  21. #define mid ((l + r) >> 1)
  22. inline void build(int u,int l,int r){
  23. t[u].l = l;
  24. t[u].r = r;
  25. if(l == r)
  26. return ;
  27. build(ls(u),l,mid);
  28. build(rs(u),mid + 1,r);
  29. }
  30. inline void up(int u){
  31. t[u].v = std::max(t[ls(u)].v,t[rs(u)].v);
  32. }
  33. inline void push_down(int u){
  34. if(t[u].tag){
  35. t[ls(u)].tag += t[u].tag;
  36. t[ls(u)].v += t[u].tag;
  37. t[rs(u)].tag += t[u].tag;
  38. t[rs(u)].v += t[u].tag;
  39. t[u].tag = 0;
  40. }
  41. }
  42. inline void md(int u,int tl,int tr,ll p){
  43. // std::cout<<u<<" "<<t[u].l<<" "<<t[u].r<<" "<<tl<<" "<<tr<<" "<<p<<std::endl;
  44. ll l = t[u].l,r = t[u].r;
  45. if(tl <= l && r <= tr){
  46. t[u].v += p;
  47. t[u].tag += p;
  48. return ;
  49. }
  50. push_down(u);
  51. if(tl <= mid)
  52. md(ls(u),tl,tr,p);
  53. if(tr > mid)
  54. md(rs(u),tl,tr,p);
  55. up(u);
  56. }
  57. inline ll find(int u,int tl,int tr){
  58. ll ans = -9e18;
  59. push_down(u);
  60. int l = t[u].l,r = t[u].r;
  61. if(tl <= l && r <= tr)
  62. return t[u].v;
  63. if(tl <= mid)
  64. ans = std::max(find(ls(u),tl,tr),ans);
  65. if(tr > mid)
  66. ans = std::max(find(rs(u),tl,tr),ans);
  67. return ans;
  68. }
  69. int main(){
  70. scanf("%lld%lld",&n,&k);
  71. for(int i = 1;i <= n;++i)
  72. scanf("%lld",&a[i]);
  73. build(1,0,n);
  74. for(int i = 1;i <= n;++i){
  75. while(tp && a[st[tp]] <= a[i]){
  76. if(a[st[tp]] == a[i]){--tp;continue;}
  77. md(1,st[tp - 1],st[tp] - 1,a[i] - a[st[tp]]);//[st[tp] + 1,st[tp + 1]]向左移一位
  78. --tp;
  79. }
  80. st[++tp] = i;
  81. md(1,i - 1,i - 1,f[i - 1] + a[i]);
  82. ll ans = find(1,std::max(i - k,(ll)0),i - 1);
  83. f[i] = ans - 1ll * INF;
  84. }
  85. // for(int i = 1;i <= n;++i)
  86. // std::cout<<f[i] + (i - 1 + k) / k * INF<<std::endl;
  87. std::cout<<f[n] + (n - 1 + k) / k * INF;
  88. }

[CCC​2019] Tourism题解的更多相关文章

  1. EOJ Monthly 2019.2 题解(B、D、F)

    EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制:  ...

  2. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  3. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  4. [题解][Codeforces]Good Bye 2019 简要题解

    构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...

  5. Atcoder Yahoo Programming Contest 2019 简要题解

    A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...

  6. CSP-S 2019 简要题解

    从这里开始 又考炸了,sad.....明年应该在准备高考了,考完把坑填了好了. 一半题都被卡常,qswl.[我汤姆要报警.jpg] dfs 怎么这么慢呀,sad..... i7 牛逼! 写的比较混乱, ...

  7. CF round 623 Div.1D Tourism 题解

    题目链接:https://codeforces.com/contest/1314/problem/D 大意: \(n\) 个顶点的有向图,顶点编号为 \(1\) 到 \(n\),任意两个不同的顶点 \ ...

  8. P5290 [十二省联考2019]春节十二响

    题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...

  9. HNOI2019 简要题解

    HNOI 2019 简要题解 没想到自己竟也能有机会写下这篇题解呢. LOJ Luogu Day1T1 鱼 枚举\(AD\)两点后发现\(BC\)与\(EF\)相对独立,因此只需要计算合法的\(BC\ ...

随机推荐

  1. 解决GitHub访问慢

    话不多说,上干货~~~ 1. 打开 http://tool.chinaz.com/dns/ ,在输入框中填写 github.com,然后点击检测按钮,会列出响应ip,如图: 2. 找到hosts文件, ...

  2. 代码混淆保安全「GitHub 热点速览 v.21.43」

    作者:HelloGitHub-小鱼干 虽然让代码难以阅读看似是件难以理解的事情,但是混淆后的代码起到了类似加密的作用,而且经过混淆的代码依旧能实现原代码的功能.javascript-obfuscato ...

  3. Spring DeferredResult 异步请求

    Spring DeferredResult 异步请求 一.背景 二.分析 三.实现要求 四.后端代码实现 五.运行结果 1.超时操作 2.正常操作 六.DeferredResult运行原理 六.注意事 ...

  4. springboot读取配置文件中的信息

    在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...

  5. 攻防世界 web2.robots

    输入ip/robots.txt,显示出了flag目录,直接访问.

  6. 攻防世界 杂项13.can_has_stdio?

    打开发现是由trainfuck编码组成的小星星阵容,果断交给解密网站进行解密, 解密网站:http://ctf.ssleye.com/brain.html flag:flag{esolangs_for ...

  7. 翻转子串 牛客网 程序员面试金典 C++ Python

    反转子串 牛客网 程序员面试金典 C++ Python 题目描述 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串.请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查 ...

  8. HTML基础强化

    1.如何理解HTML? HTML类似于一份word"文档" 描述文档的"结构" 有区块和大纲 2.对WEB标准的理解? Web标准是由一系列标准组合而成.一个网 ...

  9. uni-app使用wx-canvas实现微信小程序上显示地图map和坐标geo

    源码 <template> <view class="echart-box"> <canvas class="ec-canvas" ...

  10. Python里字符串Format时的一个易错“点”

    这是一篇很小的笔记,原因是我做学习通的时候见到了这个题: 当时看了一会儿发现没有符合自己想法的答案,然后就脑袋一热选了C,结果当然是错了... 看了一眼这个format的字符串对象,发现有个 {:7. ...