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 ...
随机推荐
- 初三奥赛模拟测试1--T1回文
初三奥赛模拟测试1--\(T1\)回文 HZOI 题意 给定一个 \(n \times m\) 的,由字符组成的矩阵 \(A\) , 问你由 \(( 1 , 1 )\) 开始,点 \(( i , j ...
- 关于vscode自动格式化的坑(Prettier - Code formatter)
在入坑vscode的时候在网上找了一些扩展包,其中有一款名为Prettier - Code formatter的代码格式化工具,其作用为当按下ctrl+s的时候自动进行格式化(当你进行格式化操作的时候 ...
- 对GEE下载时分块影像进行镶嵌(GDAL)
前言 GDAL自带的镶嵌功能比较单一,只能将图像简单拼接到一起,不能实现直方图匀色以及羽化等功能,但是对GEE导出的分块影像进行镶嵌较为适合. 优点: 使用代码,镶嵌多个影像较为简便 GDAL较为稳定 ...
- 【图文安装教程】在docker中安装kibana
在上一篇中,我们已经在docker里面安装了ES. kibana可以给我们提供一个elasticsearch的可视化界面,便于我们学习. 所以,本篇咱们就在docker里面安装kibana图文教程: ...
- Time Zone, Leap Year, Date Format, Epoch Time 时区, 闰年, 日期格式
前言 以前有写过一篇了, 但很乱, 这篇就作为它的整理版吧. Leap Year 闰年 闰年是指那些有 366 天, 二月份有 29号 的年份. 比如 2020年 有 2月29日, 所以 2020 就 ...
- Asp.net core 学习笔记 Secret 和 Data Protect Azure key-vault & Storage Account 第 2 篇
更新 30-04-2023 最新版本请看这 2 篇 ASP.NET Core – User Secret & Azure Key Vault 之前有写过 2 篇关于 key-vault 和 d ...
- 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
全网最适合入门的面向对象编程教程:50 Python 函数方法与接口-接口和抽象基类 摘要: 在 Python 中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类 ...
- java基础 -网络编程笔记
666,InetAddress package com.hspedu.api; import java.net.InetAddress; import java.net.UnknownHostExce ...
- 用C#写个PDF批量合并工具简化日常工作
一. 前言 由于项目需要编写大量的材料,以及各种签字表格.文书等,最后以PDF作为材料交付的文档格式,过程文档时有变化或补充,故此处理PDF文档已经成为日常工作的一部分. 网上有各种PDF处理工具,总 ...
- 生理性喜欢(把我吃掉&病态饥饿)
alloverzyt 转载好文章 https://www.zhihu.com/question/627599874/answer/3494578704 什么是生理性喜欢? 是吃掉. 这不是什么夸张的写 ...