染色:傻逼题。

赛时没切染色的都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!都是唐氏!

包括我。

真的太傻逼了这题。

我今晚心血来潮一打这题,随便优化一下,就 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\) 即可。

异色转移

条件:无。

显然的转移:

\[dp_{i,a_{i-1}}=\max(\max_{j=1}^{j=V_{max}} dp_{i-1,j},a_i+dp_{i-1,a_i}-[a_i=a_{i-1}]\times 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 ] [ 前缀和优化 ]的更多相关文章

  1. TYVJ1071 LCIS 线性DP+决策集优化

    问题描述 TYVJ1071 题解 暴力\(\mathrm{DP}\) 首先,一个\(O(n^3)\)的解法: 设\(opt_{i,j}\)代表\(a\)的前\(i\)个和\(b\)的前\(j\)个的\ ...

  2. 【AHOI2009】中国象棋 题解(线性DP+数学)

    前言:这题主要是要会设状态,状态找对了问题迎刃而解. --------------------------- 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可 ...

  3. LG2893/POJ3666 「USACO2008FEB」Making the Grade 线性DP+决策集优化

    问题描述 LG2893 POJ3666 题解 对于\(A\)中的每一个元素,都将存在于\(B\)中. 对\(A\)离散化. 设\(opt_{i,j}\)代表\([1,i]\),结尾为\(j\)的最小代 ...

  4. Mowing the Lawn【线性dp + 单调队列优化】

    题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...

  5. bzoj 4899 记忆的轮廓 题解(概率dp+决策单调性优化)

    题目背景 四次死亡轮回后,昴终于到达了贤者之塔,当代贤者夏乌拉一见到昴就上前抱住了昴“师傅!你终于回来了!你有着和师傅一样的魔女的余香,肯定是师傅”.众所周知,大贤者是嫉妒魔女沙提拉的老公,400年前 ...

  6. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  7. luogu P1126 机器人搬重物 题解

    luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...

  8. BZOJ 4033: [HAOI2015]树上染色题解

    BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...

  9. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  10. 线性dp

    线性dp应该是dp中比较简单的一类,不过也有难的.(矩乘优化递推请出门右转) 线性dp一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...

随机推荐

  1. python之DataClass

    Python 在版本 3.7 (PEP 557) 中引入了dataclass.dataclass允许你用更少的代码和更多的开箱即用功能来定义类. 下面定义了一个具有两个实例属性 name 和 age ...

  2. C语言离散化

    C语言离散化 最近看到STL就不想用, 于是写个C语言离散化, 居然能过主席树板子, 就写个博客介绍一下. qsort和bsearch都在<stdlib.h>或<cstdlib> ...

  3. manim边做边学--文字的创建与销毁

    本篇开始介绍Manim中的动画模块,动画模块是整个框架的核心魅力所在. Manim不仅提供了可以直接实现各种各样动画效果的对象, 还提供了设置动画的时长.延迟时间以及运动速率等参数,可以据此发挥自己的 ...

  4. manim边做边学--淡入淡出

    本篇介绍Manim中的淡入和淡出动画效果. 淡入FadeIn 主要用于让对象以渐变的方式在场景中显现. 它的特点是视觉上柔和过渡,能自然地引导观众注意新出现的元素. 淡出FadeOut 则是使对象逐渐 ...

  5. https://eggjs.org/zh-cn/basics/env.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83

    转载:https://eggjs.org/zh-cn/basics/env.html#自定义环境 运行环境 一个 Web 应用本身应该是无状态的,并拥有根据运行环境设置自身的能力. 指定运行环境 框架 ...

  6. MybatisPlusException: can not find lambda cache for this entity[]异常解决

    文章目录 场景说明 解决方案 场景说明   简单来说,我们系统中许多数据都是树状结构的,所以我定义了一个实体类父类BaseTreePO,并且想封装一个通用的树状对象的Service类,部分代码如下: ...

  7. PpcProcessResult

    @Data @Accessors(chain = true) public class PpcProcessResult { public static volatile int globalThre ...

  8. Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)

    一.前言 最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右,那 ...

  9. Qt开源作品39-日志输出增强版V2022

    一.前言 之前已经开源过基础版本,近期根据客户需求和自己的项目需求,提炼出通用需求部分,对整个日志重定向输出类重新规划和重写代码. 用Qt这个一站式超大型GUI超市做开发已经十二年了,陆陆续续开发过至 ...

  10. [转]CMake学习笔记(一)基本概念介绍、入门教程及CLion安装配置

    原文链接:CMake学习笔记(一)基本概念介绍.入门教程及CLion安装配置