P11233 CSP-S 2024 染色
P11233 CSP-S 2024 染色
考试最后码方程忘记 \(a[i-1]\) 了,调不出来,只好 \(50pts\) 收尾。
思路
\(dp\) 的难点在于确定一段的颜色后,无法快速找到上一段相同颜色的结尾。
从这里入手,设 \(dp[i][0/1][0/1]\) 表示第 \(i\) 位颜色为 \(1/0\),第三维表示是一段颜色的 \(0\) 开头或 \(1\) 结尾。
设 \(sum[i][j]\) 为 \([i,j]\) 为同一个颜色的得分,有递推式:
\]
其中 \(i<j\) 且 \(sum[i][i]=0\)。
接下来考虑转移。
\(i\) 为一段颜色 \(0\) 的开头,\([j,i-1]\) 为一段颜色 \(1\),那么上一段颜色 \(0\) 的结尾在 \(j-1\) 处。之所以从 \(dp[j][1][0]\) 转移是因为需要加上 \(j\) 与上一段 \(1\) 结尾的贡献。
\]
类似的,有:
\]
\(i\) 为一段颜色 \(0\) 的结尾,这段颜色的开头 \(j\) 可以是 \([1,i]\) 中任意一个点。
那么有 \(dp[i][0][1]=\max_{j\leq i}(dp[j][0][0]+sum[j][i])\)。
类似的 \(dp[i][1][1]=\max_{j\leqq i}(dp[j][1][0]+sum[j][i])\)。
观察 \(sum\) 的求法,发现本质上可以前缀和作差优化。
重新设 \(sum[i]\) 为 \([1,i]\) 的颜色相同贡献,\([l,r]\) 颜色相同的贡献等于 \(sum[r]-sum[l]\)。
方程变为:
\]
\]
剩下两条与上面方程类似,就不写了。
对于方程 \(dp[i][0][1]\),\(dp[j][0][0]-sum[j]\) 中取一个最大值可以 \(O(1)\) 的实现,对于另一个,发现难点在于 \(a[j-1]\) 与 \(a[i]\) 颜色相同时会产生一个 \(a[i]\) 的贡献。
那么先对于所有的 \(j\) 都不加 \(a[j-1]\) 与 \(a[i]\) 的贡献求一个 \(dp[j][1][0]-sum[j]\) 的最大值,同时在 \(a[j-1]\) 与 \(a[i]\) 相同的 \(j\) 里也求一个 \(dp[j][1][0]-sum[j]\) 的最大值,最后将后一个的最大值加 \(a[i]\) 与前一个最大值比较,便可以得出 \(dp[i][0][0]\) 的最终答案。
最后答案时 \(\max(dp[n][0][1],dp[n][1][1])\)。
Ps:其实你发现第 3 维的作用仅限于统计答案,所以其实可以去掉。
具体操作看实现,时间复杂度 \(O(n)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxL=1e6+5,maxn=2e5+5;
int n;
int a[maxn];
ll cho[maxL][2],acl[2],sum[maxn],dp[maxn][2][2];
int main()
{
// freopen("color2.in","r",stdin);
// freopen("color.out","w",stdout);
int _;
scanf("%d",&_);
while(_--)
{
memset(cho,-0x3f,sizeof(cho));
memset(acl,0,sizeof(acl));
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(a[i-1]==a[i])*a[i];
for(int i=1;i<=n;i++)
{
dp[i][0][0]=max(acl[1]+sum[i-1],cho[a[i]][1]+sum[i-1]+a[i]);
dp[i][1][0]=max(acl[0]+sum[i-1],cho[a[i]][0]+sum[i-1]+a[i]);
acl[0]=max(acl[0],dp[i][0][0]-sum[i]);
acl[1]=max(acl[1],dp[i][1][0]-sum[i]);
cho[a[i-1]][1]=max(cho[a[i-1]][1],dp[i][1][0]-sum[i]);
cho[a[i-1]][0]=max(cho[a[i-1]][0],dp[i][0][0]-sum[i]);
dp[i][0][1]=acl[0]+sum[i];
dp[i][1][1]=acl[1]+sum[i];
}
printf("%lld\n",max(dp[n][0][1],dp[n][1][1]));
}
}
后记
去年忘记加 1 少 \(100pts\),今年忘记 \(-1\) 少 \(50pts\)……
P11233 CSP-S 2024 染色的更多相关文章
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- CSP的今世与未来
一.从两个工具说起 最近Google又推出了两款有关CSP利用的小工具,其一为CSP Evaluator,这是一个能够评估你当前输入的CSP能否帮助你有效避免XSS攻击的工具,其用法非常简单,在输入框 ...
- 51nod 算法马拉松18 A 染色问题
染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
- NOIP2008双栈排序[二分图染色|栈|DP]
题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- POJ1112 Team Them Up![二分图染色 补图 01背包]
Team Them Up! Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7608 Accepted: 2041 S ...
- windows2003安装证书服务:csp配置不正确、您没有此密钥容器的写访问权限
1.填写CA名称后在生成密钥时提示:csp配置不正确或安装不完整. 原因:可能的原因为CS服务(Crysptographic Service)没有启动 . ps:该服务依赖RPC服务,但RP ...
随机推荐
- zabbix snmp OID 列表
系统参数(1.3.6.1.2.1.1) OID 描述 备注 请求方式 .1.3.6.1.2.1.1.1.0 获取系统基本信息 SysDesc GET .1.3.6.1.2.1.1.3.0 监控时间 s ...
- Visual studio 2019 无法推送代码到 GitHub
博客转载:VS2022 无法推送到GitHub,也无法克隆项目_vs连不上github-CSDN博客 问题描述` 使用vs2019 git无法推送到github 解决办法` 按照大神的描述设置,非常好 ...
- python操作ipv6_用python开启临时http服务器及其ipv6支持
https://blog.csdn.net/weixin_35647799/article/details/112023159
- mysql 和 sqlalchemy 的一个测试环境
Mysql: docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysqldocker exec ...
- vue中如何使用JSX?
JSX是什么? JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 J ...
- Angular 18+ 高级教程 – Angular Compiler (AKA ngc) Quick View
前言 在 Get Started 那一篇,我们提到过 Angular Compilation.这篇稍微给点具体画面,让大家感受一下. 但不会讲细节,对细节感兴趣的可以看这篇 Medium – How ...
- Angular 18+ 高级教程 – Component 组件 の Angular Component vs Custom Elements
前言 在上一篇 Angular Component vs Web Component 中,我们整体对比了 Angular Component 和 Web Component 的区别. 这一篇我们将针对 ...
- JavaScript Library – PhotoSwipe
效果 前言 以前用过 lightbox2 和 fancyapps. lightbox2 已经没有维护了. fancyapps 改版好多次了. v2, v3 现在 v4 已经开始收费了. PhotoSw ...
- Google Analytics & Ads 学习笔记 2 (GA4 版本)
首先去 control panel admin 升级 GA4 https://support.google.com/analytics/answer/9744165?hl=en 它其实是开多一个 pr ...
- Android中VSYNC代表什么
在 Android 中,VSYNC(Vertical Synchronization)是一个垂直同步信号,用于协调显示刷新和绘图操作.VSYNC 信号的主要作用是控制屏幕刷新频率与图形渲染的同步,以确 ...