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一般是用前面的状态去推后面的,也有用后面往前面推的,这时候把循环顺序倒一倒就行了.如果有的题又要从前往后推又要从后 ...
随机推荐
- 同步工具之Vector
官网: https://vector.dev/ 用于构建可观察性管道的轻量级.超快速工具 [安装] curl --proto '=https' --tlsv1.2 -sSf https://sh.ve ...
- 如何使用图片压缩降低COS流量成本?
导语 本文将介绍如何通过[图片压缩]能力,让您降本增效的使用 COS ,文章将写得浅显易懂,旨在快速带领用户了解图片压缩的用法及带来的收益. **** 图片压缩为什么会让您降本增效?******** ...
- Python 证件照换底色
# -*- coding: utf-8 -*- ''' @Time : 2021/4/12 19:06 @Author : 水一RAR ''' import numpy as np import cv ...
- 中电金信:技术实践|Flink维度表关联方案解析
导语:Flink是一个对有界和无界数据流进行状态计算的分布式处理引擎和框架,主要用来处理流式数据.它既可以处理有界的批量数据集,也可以处理无界的实时流数据,为批处理和流处理提供了统一编程模型. 维 ...
- PHP 简易的BASE64加密
有这样一个有趣的公式:x<100; (x*53*17)%100 = x;这个公司的原理:53*17=901,x*901,的数后2位数还是x:任何符合 a * b = 100 * n +1 的值 ...
- 【Java】【Maven】002 修改maven仓库的路径与配置阿里云镜像仓库
[Java][Maven]001 下载与配置环境 - 萌狼蓝天 - 博客园 (cnblogs.com/mllt) 修改maven仓库的路径 maven指定的本地仓库的默认位置是在c盘,默认在:C:\U ...
- 【实训总结报告】大二下学期期末Java EE实训报告
站点在微信公众号(萌狼蓝天)回复便可以访问
- 【pygame】Python小游戏开发之看代码学编程
话说我学习的时候,英文文档难以理解,中文文档杂乱无章,最终还是觉得,还不如直接看代码学习. 下面是我学习过程中写的代码,注释写的很详细,我想会帮助你理解的 pip install pygame 1.游 ...
- 创建LVM报错:Can't initialize physical volume "/dev/sdb1" of volume group "myvg" without -ff
问题: 在使用fdisk /dev/sdb 删除原有LVM分区,在接着创建LVM新分区/dev/sdb1.完毕保存之后. 执行pvcreate /dev/sdb1出现报错 Can't initiali ...
- 龙哥量化:注册simnow上期所的期货仿真模拟交易账户教程步骤
永远顺着趋势交易 在技术分析这种市场研究方法中,趋势的概念绝对是核心内容.分析师所使用的全部工具, 诸如支撑和阻挡水平.价格形态.移动平均线.趋势线等等,其唯一的目的就是辅助我们估量市场趋势, 从而顺 ...