【Comet OJ - 2019国庆欢乐赛 F】 高速公路
题意
一个长度为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】 高速公路相关推荐
- Comet OJ - 2019国庆欢乐赛(赛后整理)
Comet OJ - 2019国庆欢乐赛(赛后整理) 比赛链接:传送门 PS: 做题失误: A题wa了好久不知道为什么,后来才知道乘法爆long long了 B题思路错了,应该在想清楚些. 比赛过程中 ...
- Comet OJ - 2019国庆欢乐赛 G 后缀数组
题目链接: https://www.cometoj.com/contest/68/problem/G?problem_id=3940 出题人给的题解: 我们知道,一个子串是字符串的后缀的前缀. 这就 ...
- Comet OJ - 2019国庆欢乐赛 D1 入学考试 (简单版)
https://www.cometoj.com/contest/68/problem/D1?problem_id=3936 入学考试 (简单版) 枚举 已经做完的卷子数量 然后 剩下的时间 我们二分它 ...
- Comet OJ - 2019国庆欢乐赛 G-字符串(后缀数组)
题目 思路来源 官方题解 题解 用大于z的字母将串分隔,值得一提,'z'+1=='{' 将询问串t1{t2{t3{tq{s接在一起 注意到最小k,即为s串内最前位置k 倒序遍历sa[]数组,更新在原串 ...
- Comet OJ 2019 夏季欢乐赛题解
Comet OJ 2019 夏季欢乐赛题解 我是来骗访问量的 A 完全k叉树 \(n\)个点的完全k叉树的直径. 直接做 B 距离产生美 直接做 C 烤面包片 \(n!!!\mod p\) 显然\(n ...
- Comet OJ - 2019 六一欢乐赛
传送门 #A: 思路:等差数列求和,看成俩次1+2+-+ n,多加的n减去,所以 ans = n*(n+1) - n. AC代码: 1 #include<iostream> 2 #incl ...
- Comet OJ - 2019六一欢乐赛
这个题目我先写了些简单的 之后继续填坑: 比赛链接 题目链接 题目描述 小智是一名刚满十岁的男孩,住在真新镇中,他目标是成为一名优秀的宝可梦训练师,他明天就要从大木博士那里获得自己的第一只宝可梦了.博 ...
- Comet OJ - 2019六一欢乐赛C.收服宝可梦吧!
题目描述 继上一话皮卡丘把那几个坏人炸飞之后,小智确认皮卡丘已经完全恢复了.于是带着皮卡丘继续上路,前往尼比市去,小霞为了她的脚踏车的事情也一直跟着小智. 在通往尼比市的路上,要经过一个漆黑的常磐森林 ...
- Comet OJ - 2019六一欢乐赛题解
第001话 宝可梦,就决定是你了! 等差数列求和公式 #include <cstdio> #include <iostream> #include <vector> ...
最新文章
- 万年历的设计c语言,万年历设计报告
- 【数据库】 兴唐第二十七节课只sql注入
- 如何批量转移大量的邮件?
- SpringBoot配置属性之DataSource
- 家庭安全摄像头:应选择本地还是云端存储?
- 公共服务领域英文译写规范_公共领域日:对版权和公共领域重要性的思考
- Hibernate C3P0连接池配置
- 块元素、行内块和内联元素_如何删除内联块元素之间的空间?
- c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...
- 地铁看java书女生_地铁上背单词的女孩
- 国产 14nm 迎曙光,进口荷兰光刻机顺利入厂!
- 最简单的基于FFmpeg的移动端例子:Android 推流器
- (转)百度金融联合多方发布国内首单区块链证券化项目 发行规模超4亿
- 【杂谈】Windows安装Fluent Terminal
- linux 向日葵教程,远程控制工具——Centos7上向日葵安装使用(转)
- 微信文件夹的dat文件怎么打开_微信dat后缀的文件怎么打开
- 电脑遇到蓝屏的时候怎么解决
- 出现单实例模式毁坏Destroying singletons
- 守望先锋的蜂窝盾制作
- cloudflare免费证书_新Cloudflare:免费CDN+免费SSL证书轻松搞定https