Luogu P11233 CSP-S2024 染色 题解 [ 蓝 ] [ 线性 dp ] [ 前缀和优化 ]
染色:傻逼题。
赛时没切染色的都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!
包括我。
真的太傻逼了这题。
我今晚心血来潮一打这题,随便优化一下,就 AC 了。
怎么做到这么蠢的啊我。
暴力 dp
不要从子串的角度去考虑,我们对每一个数进行考虑 dp,否则会和我在场上一样想成用区间设计 dp,并且只能打出 \(O(n^4)\) 的暴力出来。
设计 \(dp_{i}\) 表示考虑到第 \(i\) 个数的最大值。
这里不用设计两种颜色的状态,因为他们本质上都是一样的,我们分段时只注重前一段的开头的前一个数,仅此而已。
那么很显然就可以打个 \(n^2\) 的暴力了吧?然后 \(50pts\) 到手,然后我考场上没想出来,太傻逼了。
值域优化
显然,我们不用枚举前一段的开头的前一个数在哪,只需要知道它的值是什么就好了。这样就能根据前缀取个最大值进行 dp 了。
设计 \(dp_{i,v}\) 表示考虑到第 \(i\) 个数,本段区间的开头的前一个数是 \(v\) 时的最大答案。为啥是本段呢,因为下一段转移的时候,这里的本段就成了前一段。
于是显然就维护一个线段树转移一下就好了啊。
有两种转移,第一个是同色转移,第二个是不同色转移。
同色转移
条件:\(a_i=a_{i-1}\)。
我们只要给线段树上每一个点加上 \(a_i\) 即可。
异色转移
条件:无。
显然的转移:
\]
就是要么这一段开头与前一段开头的前一个数不相等,挑一个最大值转移,要么就是相等,加上贡献即可,注意由于之前进行过同色转移,要减掉这一部分的贡献。(可以证明同色转移之后一定是最大的,因为毕竟都把之前所有值的最大值加了 \(a_i\) 嘛)
时间 \(O(t n \log V)\),有几率被卡。
数组优化
观察到只有全局最大值,全局加,单点修改操作,于是直接把线段树换成数组省去一个老哥即可。
全局加直接打懒标记就好。
由于懒标记一视同仁,所以比较加懒标记之前的 dp 值转移,输出时加上懒标记即可。
时间 \(O(tV)\),单组数据时间复杂度瓶颈在于初始化。
代码
/*
定义 dp_i,0/1 表示第 i 个数染色为 1 或 0 时的最大得分。
我们分别维护每种元素在考虑到第 i 个元素时充当上一段段尾的最大得分。
和上个数同色时:
当 i=i-1 时,此时前面的数里面全部加该点的点权。
否则不做任何改动。
这个数作为新开头:
修改上一个元素在 dp 里的值。
转移是 dp_{i-1}=max(allmax,a_i+dp_{i}-[i==i-1]*a[i])
*/
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
ll n,a[200005],dp[1000005],add,mx=0;
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
memset(dp,-0x3f,sizeof(dp));
add=0;
mx=0;
for(int i=1;i<=n;i++)
{
if(a[i]==a[i-1])add+=a[i];
dp[a[i-1]]=max(mx,a[i]+dp[a[i]]-(a[i]==a[i-1])*a[i]);
mx=max(mx,dp[a[i-1]]);
}
cout<<mx+add<<'\n';
}
int main()
{
//freopen("color.in","r",stdin);
//freopen("color.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)solve();
return 0;
}
Luogu P11233 CSP-S2024 染色 题解 [ 蓝 ] [ 线性 dp ] [ 前缀和优化 ]的更多相关文章
- TYVJ1071 LCIS 线性DP+决策集优化
问题描述 TYVJ1071 题解 暴力\(\mathrm{DP}\) 首先,一个\(O(n^3)\)的解法: 设\(opt_{i,j}\)代表\(a\)的前\(i\)个和\(b\)的前\(j\)个的\ ...
- 【AHOI2009】中国象棋 题解(线性DP+数学)
前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...
- LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化
问题描述 LG2893 POJ3666 题解 对于\(A\)中的每一个元素,都将存在于\(B\)中. 对\(A\)离散化. 设\(opt_{i,j}\)代表\([1,i]\),结尾为\(j\)的最小代 ...
- Mowing the Lawn【线性dp + 单调队列优化】
题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...
- bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)
题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...
- 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解
前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- BZOJ 4033: [HAOI2015]树上染色题解
BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 线性dp
线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
随机推荐
- Springboot优雅读配置文件
转载自Springboot优雅读配置文件 很多时候我们需要将一些常用的配置信息比如阿里云oss配置.发送短信的相关信息配置等等放到配置文件中. 下面我们来看一下 Spring 为我们提供了哪些方式帮助 ...
- C#向JAVA发送form-data文件问题处理方案
前言 和上一篇文章一样,.NET 和 JAVA之间的接口请求又遇到了新问题 我们有一个用来接收文件的接口,外部把文件流.文件名.目录,传进来,我们系统把生成的附件ID反回去,接口为POST-form- ...
- 前端好用API之MutationObserver
前情 一直以来都没有好的方式可以监听元素变化,Mutation events虽然可以监听DOM树结构变化,但是因性能问题和差的兼容问题(Webkit内核不支持)并不推荐使用. MutationObse ...
- JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
作为一位前端开发者,我们经常会听到这么一句话:"JavaScript的执行是按照顺序自上而下依次执行的."这句话说的并没有错.但是它似乎又好像不完全对.我们先来看以下这段代码.你觉 ...
- orangepi zero3 使用dd命令进行SD卡系统备份与还原
1. 使用dd命令备份整个sd卡 首先使用 df -h命令查看sd卡挂载名,如下所示,sd卡挂载为 /dev/sdc meng@meng:~/桌面/code$ df -h 文件系统 大小 已用 可用 ...
- vue3 + vite 报错处理
TypeError: vite.defineConfig is not a function 执行命令:npm install @vitejs/plugin-vue -D config里面配置代码: ...
- 【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
@ 目录 数据库 创建数据库 使用数据库 删除数据库 查看所有数据库 数据表 查看数据库中所有数据表 在数据库中创建数据表 删除数据表 修改表名 查询表列(字段)信息 表-删除某一字段 表-增加某一字 ...
- 【前端】【样式】CSS居中的三种方式
@charset "utf-8"; /* CSS Document */ /** *开发者:萌狼蓝天 *当前版本:v0.1[Debug] *最后更新日期:20210918 **/ ...
- shell中 ${}, ##, %%, :-,:+, ? 的使用
假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${}分别替换得到不同的值:${file#*/} 删掉第一个/及其左边的字符串:dir1/dir2/d ...
- [转]v-mode 提示错误 v-model directives require the attribute value which is valid as LHS.
v-mode总是提示错误 v-model directives require the attribute value which is valid as LHS. 为什么调用过滤总是提示这个错呢? ...