Solution -「ZJOI 2020」「洛谷 P6631」序列
\(\mathcal{Description}\)
Link.
给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作:
- 取 \([l,r]\),将其中所有 \(a\) 值 \(-1\);
- 取 \([l,r]\),将其中奇数下标的 \(a\) 值 \(-1\);
- 取 \([l,r]\),将其中偶数下标的 \(a\) 值 \(-1\)。
求至少需要几次操作使得所有 \(a\) 值变为 \(0\)。
\(n\le10^5\),数据组数 \(T\le10\)。
\(\mathcal{Solution}\)
道路铺设永放光芒!
记集族 \(\mathcal I\) 包括所有一次操作可能涉及的下标集合,写出线规
\operatorname{s.t.} \begin{cases}
\forall u,~\sum_{P\ni u}x_P\ge a_u\\
\forall u,~-\sum_{P\ni u}x_P\ge -a_u\\
\forall P,~x_P\ge 0
\end{cases}
\]
转对偶
\operatorname{s.t.}\begin{cases}
\forall P,~\sum_{u\in P}(s_u-t_i)\le1\\
\forall u,~s_u,t_u\ge0
\end{cases}
\]
令 \(d_u=s_u−t_u\),由第一个约束,显然有 \(d_u\le1\);而为最大化 \(\sum_{u=1}^na_ud_u\),可以得到 \(d_u\in\{-1,0,1\}\)。那么就能简单 DP:令 \(f(i,x,y,z)\) 表示考虑了 \(d_{1..i}\),一类/二类/三类操作涉及的操作集合中,最大后缀 \(d\) 之和为 \(x/y/z~(\in\{0,1\})\),枚举 \(d_u=1,2,3\) 分别转移即可。
复杂度 \(\mathcal O(Tn)\)(其实带一个 \(\ge \log n\) 的 \(24\) 倍常数 qwq)。
\(\mathcal{Code}\)
/*~Rainybunny~*/
#include <cstdio>
#include <cstring>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
inline int rint() {
int x = 0, f = 1, s = getchar();
for ( ; s < '0' || '9' < s; s = getchar() ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar() ) x = x * 10 + ( s ^ '0' );
return x * f;
}
template<typename Tp>
inline void wint( Tp x ) {
if ( x < 0 ) putchar( '-' ), x = -x;
if ( 9 < x ) wint( x / 10 );
putchar( x % 10 ^ '0' );
}
template<typename Tp>
inline void chkmax( Tp& a, const Tp& b ) { a < b && ( a = b, 0 ); }
inline int imax( const int a, const int b ) { return a < b ? b : a; }
const int MAXN = 1e5;
const LL LINF = 1ll << 60;
int n, a[MAXN + 5];
LL f[MAXN + 5][2][2][2];
int main() {
for ( int T = rint(); T--; ) {
n = rint();
rep ( i, 1, n ) a[i] = rint();
memset( f, 0xc0, sizeof f );
f[0][0][0][0] = 0;
rep ( i, 1, n ) rep ( w, -1, 1 ) {
rep ( x, 0, 1 ) rep ( y, 0, 1 ) rep ( z, 0, 1 ) {
if ( w + x <= 1 && w + ( i & 1 ? y : z ) <= 1 ) {
chkmax( f[i][imax( imax( w, w + x ), 0 )]
[i & 1 ? imax( imax( w, w + y ), 0 ) : y]
[i & 1 ? z : imax( imax( w, w + z ), 0 )],
f[i - 1][x][y][z] + w * a[i] );
}
}
}
LL ans = -LINF;
rep ( x, 0, 1 ) rep ( y, 0, 1 ) rep ( z, 0, 1 ) {
chkmax( ans, f[n][x][y][z] );
}
wint( ans ), putchar( '\n' );
}
return 0;
}
Solution -「ZJOI 2020」「洛谷 P6631」序列的更多相关文章
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 洛谷 P1628 合并序列
洛谷 P1628 合并序列 题目传送门 题目描述 有N个单词和字符串T,按字典序输出以字符串T为前缀的所有单词. 输入格式 输入文件第一行包含一个正整数N: 接下来N行,每行一个单词,长度不超过100 ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「洛谷 P4372」Out of Sorts P
\(\mathcal{Description}\) OurOJ & 洛谷 P4372(几乎一致) 设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- Solution -「APIO 2016」「洛谷 P3643」划艇
\(\mathcal{Description}\) Link & 双倍经验. 给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...
- 「洛谷4197」「BZOJ3545」peak【线段树合并】
题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...
- 「BZOJ2733」「洛谷3224」「HNOI2012」永无乡【线段树合并】
题目链接 [洛谷] 题解 很明显是要用线段树合并的. 对于当前的每一个连通块都建立一个权值线段树. 权值线段树处理操作中的\(k\)大的问题. 如果需要合并,那么就线段树暴力合并,时间复杂度是\(nl ...
随机推荐
- Linux查看进程启动时间和运行多长时间
Linux 查看进程启动时间和运行多长时间 启动时间 ps -eo lstart 运行多长时间 ps -eo etime -bash-4.1$ ps -eo pid,lstart,etime | gr ...
- java 方法 compareTo()的正确使用
总结:(1)如果比较的是数字 则结果大于则为1 等于则为0 小于则为-1(2)如果比较的是字符[串] 则按照从左到右排序找对应不一样的字符第一个字符, 然后将字符装对应的ASCLL码数字,做减法运算, ...
- Win10如何更改C:\Users\下的用户名
详细操作步骤博文原址 : https://blog.csdn.net/wls666/article/details/103334152 但是,改完后会出现报错 这是微软应用商城出现问题 ,每次开机 ...
- Visual Studio 设置背景图片主题(所有版本设置方法)
前言 效果预览: 目录 扩展安装 图片背景设置 主题透明并扩展到 IDE 内容 扩展安装 ClaudiaIDE 扩展下载 我们打开VS的扩展安装界面:[扩展]->[管理扩展]->[联机], ...
- 遍历hashmap的6种方法
1. 通过ForEach循环进行遍历 mport java.io.IOException; import java.util.HashMap; import java.util.Map; public ...
- List接口的实现类
(一): ArrayList 构造方法 特有的方法: LinkedList 特点: 可以调用Collections类的静态方法 synchronizedCollection转换成线程安全的
- HIVE执行引擎TEZ学习以及实际使用
概述 最近公司在使用Tez,今天写一篇关于Tez的学习和使用随笔.Tez是Apache最新的支持DAG作业的开源计算框架,它可以将多个有依赖的作业转换为一个作业从而大幅提升DAG作业的性能.Tez并不 ...
- Redisson-关于使用订阅数问题
一.前提 最近在使用分布式锁redisson时遇到一个线上问题:发现是subscriptionsPerConnection or subscriptionConnectionPoolSize 的大小不 ...
- Redis 事务支持 ACID 么?
腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通.」 ...
- 《剑指offer》面试题15. 二进制中1的个数
问题描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:00000 ...