题解:P7482 不条理狂诗曲
题解:P7482 不条理狂诗曲
本题解借鉴 blossom_j 大佬思路,但这位大佬的题解似乎没放正确代码。
题意
对于每一个 \(a\) 的子区间 \(a_{l\dots r}\),求选择若干个不连续的数的和的最大值,对答案取模 \(10^{9}+7\)。
思路
主要算法:分治。
计算跨过中点 \(mid\) 的区间的 \(f\) 之和。
首先我们可以写一个 DP。\(f_{i,0/1,0/1}\) 表示 DP 已到达 \(i\) 的位置。第一个 \(0/1\) 表示 \(mid\) 或 \(mid+1\) 是否被选择。第二个 \(0/1\) 表示是否选择了第 \(i\) 个元素。
枚举 \(l\) 对所有的 \(r\) 求和:设 \(g_{i,j}=\max\{f_{i,j,0},f_{i,j,1}\}\)。区间 $\left [ l,r \right ] $ 的答案就是 \(\max\{g_{l,0}+\max\{g_{r,0},g_{r,1}\},g_{l,1}+g_{r,0}\}\)。
若 \(g_{l,0}-g_{l,1}\le g_{r,0}-\max\{g_{r,0},g_{r,1}\}\),则必需选择后者。
将 \(g_{r,0}-\max\{g_{r,0},g_{l,1}\}\) 排序,二分寻找分界点。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1000000007, Maxn = 2 * 1e5 + 10;
int n, a[Maxn], ans = 0, f[Maxn][2][2], g[Maxn][2],sa[Maxn], sb[Maxn];
struct Node {
int date, ID;
} d[Maxn];
bool cmp(Node x, Node y) {
return x.date < y.date;
}
int ask(int x, int l, int r) {
while (l < r) {
int mid = (l + r + 1) >> 1;
if (d[mid].date <= x)l = mid;
else r = mid - 1;
}
return l;
}
void solve(int l, int r) {
if (l == r) {
ans = (ans + a[l]) % mod;
return;
}
int mid = (l + r) >> 1;
f[mid + 1][0][0] = f[mid + 1][0][1] = f[mid + 1][1][0] = 0, f[mid + 1][1][1] = a[mid + 1];
g[mid + 1][0] = f[mid + 1][0][0];
g[mid + 1][1] = f[mid + 1][1][1];
d[mid + 1].ID = mid + 1;
d[mid + 1].date = g[mid + 1][0] - max(g[mid + 1][0], g[mid + 1][1]);
for (int i = mid + 2; i <= r; i++) {
f[i][0][0] = max(f[i - 1][0][0], f[i - 1][0][1]);
f[i][1][0] = max(f[i - 1][1][0], f[i - 1][1][1]);
f[i][0][1] = f[i - 1][0][0] + a[i];
f[i][1][1] = f[i - 1][1][0] + a[i];
g[i][0] = max(f[i][0][0], f[i][0][1]);
g[i][1] = max(f[i][1][0], f[i][1][1]);
d[i].ID = i;
d[i].date = g[i][0] - max(g[i][0], g[i][1]);
}
sort(d + mid + 1, d + r + 1, cmp);
sa[mid] = sb[mid] = sa[r + 1] = sb[r + 1] = 0;
for (int i = mid + 1; i <= r + 1; i++) {
sa[i] = sa[i - 1] + g[d[i].ID][0];
sb[i] = sb[i - 1] + max(g[d[i].ID][0], g[d[i].ID][1]);
}
f[mid][0][0] = f[mid][0][1] = f[mid][1][0] = 0, f[mid][1][1] = a[mid];
g[mid][0] = f[mid][0][0];
g[mid][1] = f[mid][1][1];
int k = ask(g[mid][0] - g[mid][1], mid, r);
ans = (ans + g[mid][0] * (k - mid) % mod + sb[k] + sa[r] - sa[k] + g[mid][1] * (r - k) % mod + mod) % mod;
for (int i = mid - 1; i >= l; i--) {
f[i][0][0] = max(f[i + 1][0][0], f[i + 1][0][1]);
f[i][1][0] = max(f[i + 1][1][0], f[i + 1][1][1]);
f[i][0][1] = f[i + 1][0][0] + a[i];
f[i][1][1] = f[i + 1][1][0] + a[i];
g[i][0] = max(f[i][0][0], f[i][0][1]);
g[i][1] = max(f[i][1][0], f[i][1][1]);
int k = ask(g[i][0] - g[i][1], mid, r);
ans = (ans + g[i][0] * (k - mid) % mod + sb[k] + sa[r] - sa[k] + g[i][1] * (r - k) % mod + mod) % mod;
}
solve(l, mid), solve(mid + 1, r);
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
solve(1, n);
cout << ans << '\n';
return 0;
}
题解:P7482 不条理狂诗曲的更多相关文章
- BZOJ2821:作诗——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2821 问题描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好 ...
- 【BZOJ2821】作诗 题解(分块+前缀和)
前言:世间还有这么卡常的题…… ------------------ 题目链接 题目大意:给定长度为$n$的序列${a_i}$.有$m$次询问,问$[l,r]$内出现正偶数次的数字有多少个. 这题跟蒲 ...
- 洛谷 P4135 作诗 题解
题面. 之前做过一道很类似的题目 洛谷P4168蒲公英 ,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像. 题目要求区间内出现次数为正偶数的数字的数量. 数据范围1e5,可以分块. 我们 ...
- 【BZOJ2821】作诗(Poetize) 分块
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
- JSOI2015 一轮省选 个人题解与小结
T1: 题目大意:现有一个以1为根节点的树,要求从1开始出发,经过下面的点然后最终要回到根节点.同时除了根节点之外各点均有一个权值(即受益,每个点上的收益只能拿一次,且经过的话必须拿),同时除了根节点 ...
- vijos1010题解
题目: 话说乾隆带着他的宰相刘罗锅和你出巡江南,被杭州城府邀请去听戏,至于什么戏,那就不知了.乾隆很高兴,撒酒与君臣共享.三更欲回住处,可是乾隆这人挺怪,他首先要到西湖边散散步,而且命令不准有人跟着他 ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- PAT甲级题解(慢慢刷中)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- CH4907 作诗
题意 4907 作诗 0x49「数据结构进阶」练习 描述 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY ...
- bzoj 1860: [Zjoi2006]Mahjong麻将 题解
[原题] 1860: [Zjoi2006]Mahjong麻将 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 211 Solved: 122 [Subm ...
随机推荐
- RCTF 2024 WEB wp
RCTF 2024 WEB wp 前言 赛后复现,proxy发现自己真是个呆b... what_is_love 首先拿key1,sql语句处有注入,可以盲注拿key1的值 import request ...
- itest(爱测试) 开源接口测试,敏捷测试管理平台10.1.4发布
一:itest work 简介 itest work 开源敏捷测试管理,包含极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock,还有压测 ,又有丰富的统计分析,8合1工作站.可按 ...
- IMX6ULL基本环境搭建
基本环境搭建 1 交叉编译工具 在虚拟机中安装交叉编译工具,为后续开发做准备. 1.1 工具版本 工具版本:Linaro Releases 当前虚拟机为64位系统,因此下载64位系统的工具: $ un ...
- (三)Redis 线程与IO模型
1.Redis 单线程 通常说 Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,其他功能,比如持久化.异步删除.集群数据同步等,是由额外的线程执行的,所以严 ...
- c# HttpWebRequest 解决 请求HTTPS慢
其实就几行代码 if (strUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { request.Cred ...
- kettle从入门到精通 第五十二课 ETL之kettle Avro output
1.上一节课我们学习了avro input,本节课我们一起学习下avro out步骤. 本节课通过json input 加载json文件,通过avro out 生成avro二进制文件,写日志步骤打印日 ...
- 推荐十个优秀的ASP.NET Core第三方中间件,你用过几个?
ASP.NET Core 作为一个强大的.跨平台的.高性能的开源框架,为开发者提供了丰富的功能和灵活的扩展性.其中,中间件(Middleware)是 ASP.NET Core 架构中的核心组件之一,它 ...
- INFINI Labs 产品更新 | Easysearch 1.7.1发布
INFINI Labs 产品又更新啦~,包括 Console,Gateway,Agent 1.23.0 和 Easysearch 1.7.1.此次版本重点修复历史遗留 Bug .网友们提的一些需求等. ...
- 338 warnings potentially fixable with the `--fix` option.
将lint的值设置为eslint --fix --ext .js,.vue src,重启就可以了或者直接把lint这行删除掉
- ESM风潮下企业服务的最佳实践探讨
甄知科技孵化于中国领先的IT咨询服务提供商-上海汉得信息技术股份有限公司,主打产品"燕千云"于2019年正式发布,持续迭代版本至今,燕千云作为企业数字化服务平台,燕千云的愿景和现状 ...