「codechef - STRQUER」Strange Queries
首先对原序列排序,考虑静态序列做法为:设 \(f(n,k\in\{0,1\})\) 为对于前 \(n\) 个数,第 \(n\) 个数否 / 是已经决策完毕的最优方案,转移即
f(n,0)=f(n-1,1) \\
\displaystyle
f(n,1)=\lvert a(n)-a(n-1)\rvert+\min\{f(n-1,\{0,1\})\}
\end{cases}
\]
再由于增 / 减数操作,我们使用数据结构来维护,如果使用维护区间的数据结构那么区间 DP 是最好的选择。把状态换为 \(f(l,r,k_1\in\{0,1\},k_2\in\{0,1\})\) 表示考虑区间 \([l,r]\),左 / 右端点分别否 / 是已经决策完毕。转移即
\]
注意使用不同的数据结构转移会有不同,此处为平衡树情况的转移。不过代码写的是线段树,请注意区分。\(m\) 为 \([l,r]\) 中一点,也需要注意 \(r-l\leqslant2\) 情况的特判。
省去了一些东西,完整代码见此处,特征码 cc-strquer。
const long long inf = 1e18;
namespace {
struct node {
int ls, rs, num;
long long l, r, mx, mn;
long long dp[2][2];
long long *const operator[](const long long i) { return dp[i]; }
} [2 * 200000 * 60];
int tot;
int fuck(long long l, long long r) {
int shit = ++tot;
[shit].ls = [shit].rs = 0;
[shit].l = l, [shit].r = r;
[shit].num = 0;
return shit;
}
void Merge(node &$, node x, node y) {
node ap;
bool flag = 0;
if (!x.num) {
ap = y;
flag = 1;
}
if (!y.num) {
ap = x;
flag = 1;
}
if (flag) {
$.mn = ap.mn;
$.mx = ap.mx;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) $[i][j] = ap[i][j];
}
return;
}
$.mn = x.mn;
$.mx = y.mx;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 2; ++j) {
$[i][j] = -inf;
for (int a = 0; a < 2; ++a) {
for (int b = 0; b < 2; ++b)
Max($[i][j], x[i][a] + y[b][j] + a * b * (y.mn - x.mx));
}
}
}
}
void add(int p, long long x, int v) {
auto &l = [p].l, &r = [p].r;
if (!p) p = ++tot;
[p].num += v;
if (l == r) {
[p].mx = [p].mn = x;
[p][0][0] = [p][1][1] = -inf;
[p][0][1] = [p][1][0] = 0;
return;
}
long long mid = (l + r) >> 1;
if (mid >= x) {
if (![p].ls) [p].ls = fuck(l, mid);
add([p].ls, x, v);
} else {
if (![p].rs) [p].rs = fuck(mid + 1, r);
add([p].rs, x, v);
}
Merge([p], [[p].ls], [[p].rs]);
}
} // namespace
signed main() {
int T;
for (cin > T; T; --T) {
int n, q;
cin > n > q;
::fuck(0, inf);
for (long long x; n; --n) {
cin > x;
::add(1, x, 1);
}
for (int t; q; --q) {
long long x;
cin > t > x;
if (t == 0)
::add(1, x, 1);
else
::add(1, x, -1);
cout < ::[1].mx - ::[1].mn - imax(::[1][1][1], 0LL) < '\n';
}
::tot = 0;
}
return 0;
}
「codechef - STRQUER」Strange Queries的更多相关文章
- 「CodeChef - SKIRES」Ski Resort
题目链接 戳我 \(Description\) 给你一个\(n*m\)的网格,以及网格上的两个格子\(A,B\).每个格子有一个高度.每次操作可以选择一个格子(不能是\(A\)或\(B\))并将它的高 ...
- Solution -「CodeChef JUMP」Jump Mission
\(\mathcal{Description}\) Link. 有 \(n\) 个编号 \(1\sim n\) 的格子排成一排,并有三个权值序列 \(\{a_n\},\{h_n\},\{p_n ...
- Solution -「CF 1380F」Strange Addition
\(\mathcal{Description}\) Link. 定义两个数在进行加法时,进位单独作为一位.例如: . 给定一个 \(n\) 为数和 \(m\) 次修改操作,每次修改会修改 ...
- 「Codechef April Lunchtime 2015」Palindromeness
「Codechef April Lunchtime 2015」Palindromeness 解题思路 : 考虑对于回文子串 \(s\) 贡献的定义: \[ value_s = [\ s[1,\lflo ...
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- 「学习笔记」递推 & 递归
引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
- fir.im Weekly - 如何打造 Github 「爆款」开源项目
最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...
- 更新日志 - fir.im「高级统计」功能上线
距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...
- Notepad++ 开启「切分窗口」同时检视、比对两份文件
Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...
随机推荐
- Ubuntu 对比 CentOS 后该如何选择?
大家阅读完以上文章觉得如何选择更适合自己?欢迎留言哦~ 本文章转载自 Linux 就该这么学(ID: linuxprobe),文章图片与文字版权属源公众号所有,未经允许,禁止二次转载. 我要投稿 本公 ...
- 三分钟免费将 Claude API 接入个人服务
首先我们介绍一下今天的主角 Claude Claude 是最近新开放的一款 AI 聊天机器人,是世界上最大的语言模型之一,比之前的一些模型如 GPT-3 要强大得多,因此 Claude 被认为是 Ch ...
- [ARM 汇编]进阶篇—存储访问指令—2.3.3 栈操作指令
栈是一种特殊的数据结构,其特点是后进先出(LIFO,Last In First Out).在 ARM 汇编中,栈通常用于保存函数调用时的寄存器状态.局部变量和返回地址等.本节将详细介绍 ARM 汇编中 ...
- Linux多线程(8.3 线程同步与互斥)
3. 线程的同步与互斥 为什么需要同步与互斥 一个进程运行时,数据存储在内存中.如果一个数据要进行运算,必须先将数据拷贝到寄存器中.比如要对栈上的一个int i进行"++"操作 ...
- 免杀系列之去除Defender令牌权限
本文展示了Windows存在的一个小bug,该问题允许攻击者绕过保护反恶意软件(AV/EDR)免受各种形式攻击的Windows安全机制(Windows Protected Process Light) ...
- maven报错:不再支持源选项 5。请使用 6 或更高版本
问题描述 在执行命令 mvn compile 发生错误 D:\Github_NOTES\JavaWeb_Learning\02Java\JavaWeb\Code\Maven1>mvn clean ...
- async-await Rust: 200 多行代码实现一个极简 runtime
What I cannot create, I do not understand Rust 中的 runtime 到底是咋回事, 为了彻底搞懂它, 我在尽量不借助第三方 crate 的情况下实现了一 ...
- Windows 交叉编译之 make
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/w8YV_TUb4QwsgChu3AspHg Make 是什么 Mak ...
- Mybatis(日志工厂)
日志工厂 如果一个数据库操作,出现了异常,我们需要排错.所以日志就是最好的助手 曾经:sout.debug 现在:日志工厂 SLF4J[工作中,springboot] LOG4J[掌握] LOG4J2 ...
- EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe
EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe 使用EF的Code First迁移可以用于从Visual Studio内部更新数据库,但也可通过 ...