题意

一个长度为n的序列h[i]表示第i个位置的数不能超过h[i]。每个数和相邻的数的差只能为-10,0或+10。

现在可以允许一个位置忽略限制,求数列中所有数的和最大为多少。

思路

算出没有忽略限制时所有位置的最大值a[i]。

枚举忽略限制的点。

假如一个点忽略限制能够增大答案,那么a[i]==h[i],否则即使h[i]变为无穷大他也受左右两边的限制而无法超过a[i]。

然后考虑忽略限制之后a[i]的改变。

发现所有a[i]只会增加而不可能减小,所以h[i]变化的影响范围是从i出发向左右两边延伸,到a[j]==h[j]的第一个j时停止。

假设所有h[i]==a[i]的点把序列分割成几个小段,那每个小段只会被访问O(1)次,所以暴力修改O(n)。

赛中胡结论失败。好题。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10, inf = 1e9 + 10010;
int n, h[N], r[N], l[N];
LL sum, ans;void solve(int pos)
{int pre = 0, suc = n + 1;for (int i = pos - 1; i >= 1; -- i)if (h[i] == r[i]){pre = i;break;}for (int i = pos + 1; i <= n; ++ i)if (h[i] == r[i]){suc = i;break;}int tmp = h[pos]; h[pos] = inf;LL add = 0;l[pre] = r[pre]; l[suc] = r[suc];for (int i = pre + 1; i < suc; ++ i)l[i] = min(h[i], l[i-1] + 10);for (int i = suc - 1; i > pre; -- i){l[i] = min(l[i], l[i+1] + 10);add += l[i] - r[i];}h[pos] = tmp;if (add + sum > ans) ans = add + sum;
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++ i)scanf("%d", &h[i]);r[0] = r[n + 1] = inf;for (int i = 1; i <= n; ++ i)r[i] = min(h[i], r[i-1] + 10);for (int i = n; i >= 1; -- i){r[i] = min(r[i], r[i+1] + 10);sum += r[i];}ans = sum;for (int i = 1; i <= n; ++ i)if (h[i] == r[i])solve(i);printf("%lld\n", ans);return 0;
}

【Comet OJ - 2019国庆欢乐赛 F】 高速公路相关推荐

  1. Comet OJ - 2019国庆欢乐赛(赛后整理)

    Comet OJ - 2019国庆欢乐赛(赛后整理) 比赛链接:传送门 PS: 做题失误: A题wa了好久不知道为什么,后来才知道乘法爆long long了 B题思路错了,应该在想清楚些. 比赛过程中 ...

  2. Comet OJ - 2019国庆欢乐赛 G 后缀数组

    题目链接: https://www.cometoj.com/contest/68/problem/G?problem_id=3940 出题人给的题解: 我们知道,一个子串是字符串的后缀的前缀.  这就 ...

  3. Comet OJ - 2019国庆欢乐赛 D1 入学考试 (简单版)

    https://www.cometoj.com/contest/68/problem/D1?problem_id=3936 入学考试 (简单版) 枚举 已经做完的卷子数量 然后 剩下的时间 我们二分它 ...

  4. Comet OJ - 2019国庆欢乐赛 G-字符串(后缀数组)

    题目 思路来源 官方题解 题解 用大于z的字母将串分隔,值得一提,'z'+1=='{' 将询问串t1{t2{t3{tq{s接在一起 注意到最小k,即为s串内最前位置k 倒序遍历sa[]数组,更新在原串 ...

  5. Comet OJ 2019 夏季欢乐赛题解

    Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...

  6. Comet OJ - 2019 六一欢乐赛

    传送门 #A: 思路:等差数列求和,看成俩次1+2+-+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #incl ...

  7. Comet OJ - 2019六一欢乐赛

    这个题目我先写了些简单的 之后继续填坑: 比赛链接 题目链接 题目描述 小智是一名刚满十岁的男孩,住在真新镇中,他目标是成为一名优秀的宝可梦训练师,他明天就要从大木博士那里获得自己的第一只宝可梦了.博 ...

  8. Comet OJ - 2019六一欢乐赛C.收服宝可梦吧!

    题目描述 继上一话皮卡丘把那几个坏人炸飞之后,小智确认皮卡丘已经完全恢复了.于是带着皮卡丘继续上路,前往尼比市去,小霞为了她的脚踏车的事情也一直跟着小智. 在通往尼比市的路上,要经过一个漆黑的常磐森林 ...

  9. Comet OJ - 2019六一欢乐赛题解

    第001话 宝可梦,就决定是你了! 等差数列求和公式 #include <cstdio> #include <iostream> #include <vector> ...

最新文章

  1. 万年历的设计c语言,万年历设计报告
  2. 【数据库】 兴唐第二十七节课只sql注入
  3. 如何批量转移大量的邮件?
  4. SpringBoot配置属性之DataSource
  5. 家庭安全摄像头:应选择本地还是云端存储?
  6. 公共服务领域英文译写规范_公共领域日:对版权和公共领域重要性的思考
  7. Hibernate C3P0连接池配置
  8. 块元素、行内块和内联元素_如何删除内联块元素之间的空间?
  9. c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...
  10. 地铁看java书女生_地铁上背单词的女孩
  11. 国产 14nm 迎曙光,进口荷兰光刻机顺利入厂!
  12. 最简单的基于FFmpeg的移动端例子:Android 推流器
  13. (转)百度金融联合多方发布国内首单区块链证券化项目 发行规模超4亿
  14. 【杂谈】Windows安装Fluent Terminal
  15. linux 向日葵教程,远程控制工具——Centos7上向日葵安装使用(转)
  16. 微信文件夹的dat文件怎么打开_微信dat后缀的文件怎么打开
  17. 电脑遇到蓝屏的时候怎么解决
  18. 出现单实例模式毁坏Destroying singletons
  19. 守望先锋的蜂窝盾制作
  20. cloudflare免费证书_新Cloudflare:免费CDN+免费SSL证书轻松搞定https

热门文章

  1. 如何在转换CAD图纸的时候更改背景颜色?
  2. XTU 程序设计实践模拟考试题1
  3. oracle 统计同比 环比,oracle求同比,环比函数(LAG与LEAD)的详解
  4. 四色问题:证明、推广和应用
  5. 企业研发人员配备比例_如何理解高新技术企业认定对研发人员比例的要求
  6. 融合知识图谱和用户行为信息的个性化推荐算法研究
  7. 使用fasttext实现文本处理及文本预测
  8. 母牛的故事——无脑模拟解法
  9. 小程序第三方微信授权登录的实现
  10. linux微信最新版无法打开问题解决