P11233 [CSP-S 2024] 染色 题解

P11233 [CSP-S 2024] 染色

题面:

题目描述

给定一个长度为 n n n 的正整数数组 A A A,其中所有数从左至右排成一排。

你需要将 A A A 中的每个数染成红色或蓝色之一,然后按如下方式计算最终得分:

C C C 为长度为 n n n 的整数数组,对于 A A A 中的每个数 A i A_i Ai 1 ≤ i ≤ n 1 \leq i \leq n 1in):

  • 如果 A i A_i Ai 左侧没有与其同色的数,则令 C i = 0 C_i = 0 Ci=0
  • 否则,记其左侧与其最靠近的同色数 A j A_j Aj,若 A i = A j A_i = A_j Ai=Aj,则令 C i = A i C_i = A_i Ci=Ai,否则令 C i = 0 C_i = 0 Ci=0

你的最终得分为 C C C 中所有整数的和,即 ∑ i = 1 n C i \sum \limits_{i=1}^n C_i i=1nCi。你需要最大化最终得分,请求出最终得分的最大值。

输入格式

本题有多组测试数据。

输入的第一行包含一个正整数 T T T,表示数据组数。

接下来包含 T T T 组数据,每组数据的格式如下:

第一行包含一个正整数 n n n,表示数组长度。

第二行包含 n n n 个正整数 A 1 , A 2 , … , A n A_1, A_2, \dots, A_n A1,A2,,An,表示数组 A A A 中的元素。

输出格式

对于每组数据:输出一行包含一个非负整数,表示最终得分的最大可能值。

样例 #1
样例输入 #1
3
3
1 2 1
4
1 2 3 4
8
3 5 2 5 1 2 1 4
样例输出 #1
1
0
8
提示

【样例 1 解释】

对于第一组数据,以下为三种可能的染色方案:

  1. A 1 , A 2 A_1, A_2 A1,A2 染成红色,将 A 3 A_3 A3 染成蓝色( 1 2 1 \red{1}\red{2}\blue{1} 121),其得分计算方式如下:
  • 对于 A 1 A_1 A1,由于其左侧没有红色的数,所以 C 1 = 0 C_1 = 0 C1=0
  • 对于 A 2 A_2 A2,其左侧与其最靠近的红色数为 A 1 A_1 A1。由于 A 1 ≠ A 2 A_1 \neq A_2 A1=A2,所以 C 2 = 0 C_2 = 0 C2=0
  • 对于 A 3 A_3 A3,由于其左侧没有蓝色的数,所以 C 3 = 0 C_3 = 0 C3=0
    该方案最终得分为 C 1 + C 2 + C 3 = 0 C_1 + C_2 + C_3 = 0 C1+C2+C3=0
  1. A 1 , A 2 , A 3 A_1, A_2, A_3 A1,A2,A3 全部染成红色( 121 \red{121} 121),其得分计算方式如下:
  • 对于 A 1 A_1 A1,由于其左侧没有红色的数,所以 C 1 = 0 C_1 = 0 C1=0
  • 对于 A 2 A_2 A2,其左侧与其最靠近的红色数为 A 1 A_1 A1。由于 A 1 ≠ A 2 A_1 \neq A_2 A1=A2,所以 C 2 = 0 C_2 = 0 C2=0
  • 对于 A 3 A_3 A3,其左侧与其最靠近的红色数为 A 2 A_2 A2。由于 A 2 ≠ A 3 A_2 \neq A_3 A2=A3,所以 C 3 = 0 C_3 = 0 C3=0
    该方案最终得分为 C 1 + C 2 + C 3 = 0 C_1 + C_2 + C_3 = 0 C1+C2+C3=0
  1. A 1 , A 3 A_1, A_3 A1,A3 染成红色,将 A 2 A_2 A2 染成蓝色( 1 2 1 \red{1}\blue{2}\red{1} 121),其得分计算方式如下:
  • 对于 A 1 A_1 A1,由于其左侧没有红色的数,所以 C 1 = 0 C_1 = 0 C1=0
  • 对于 A 2 A_2 A2,由于其左侧没有蓝色的数,所以 C 2 = 0 C_2 = 0 C2=0
  • 对于 A 3 A_3 A3,其左侧与其最靠近的红色数为 A 1 A_1 A1。由于 A 1 = A 3 A_1 = A_3 A1=A3,所以 C 3 = A 3 = 1 C_3 = A_3 = 1 C3=A3=1
    该方案最终得分为 C 1 + C 2 + C 3 = 1 C_1 + C_2 + C_3 = 1 C1+C2+C3=1

可以证明,没有染色方案使得最终得分大于 1 1 1

对于第二组数据,可以证明,任何染色方案的最终得分都是 0 0 0

对于第三组数据,一种最优的染色方案为将 A 1 , A 2 , A 4 , A 5 , A 7 A_1, A_2, A_4, A_5, A_7 A1,A2,A4,A5,A7 染为红色,将 A 3 , A 6 , A 8 A_3, A_6, A_8 A3,A6,A8 染为蓝色( 35 2 51 2 1 4 \red{35}\blue{2}\red{51}\blue{2}\red{1}\blue{4} 35251214),其对应 C = [ 0 , 0 , 0 , 5 , 0 , 1 , 2 , 0 ] C = [0, 0, 0, 5, 0, 1, 2, 0] C=[0,0,0,5,0,1,2,0],最终得分为 8 8 8

【样例 2】

见选手目录下的 color/color2.in 与 color/color2.ans。

【数据范围】

对于所有测试数据,保证: 1 ≤ T ≤ 10 1\leq T\leq 10 1T10 2 ≤ n ≤ 2 × 1 0 5 2\leq n\leq 2\times 10^5 2n2×105 1 ≤ A i ≤ 1 0 6 1\leq A_i\leq 10^6 1Ai106

测试点 n n n A i A_i Ai
1 ∼ 4 1\sim 4 14 ≤ 15 \leq 15 15 ≤ 15 \leq 15 15
5 ∼ 7 5\sim 7 57 ≤ 1 0 2 \leq 10^2 102 ≤ 1 0 2 \leq 10^2 102
8 ∼ 10 8\sim 10 810 ≤ 2000 \leq 2000 2000 ≤ 2000 \leq 2000 2000
11 , 12 11,12 11,12 ≤ 2 × 1 0 4 \leq 2\times 10^4 2×104 ≤ 1 0 6 \leq 10^6 106
13 ∼ 15 13\sim 15 1315 ≤ 2 × 1 0 5 \leq 2\times 10^5 2×105 ≤ 10 \leq 10 10
16 ∼ 20 16\sim 20 1620 ≤ 2 × 1 0 5 \leq 2\times 10^5 2×105 ≤ 1 0 6 \leq 10^6 106

定义 f i f_i fi 为枚举到 i i i 时的答案, s i s_i si 为相邻两项相同的前缀和。

有转移:
f i = max ⁡ { f j + [ a i = a j ] × a i + s i − 1 − s j + 1 } f_i = \max\{f_j + [a_i = a_j] \times a_i + s_{i - 1} - s_{j + 1}\} fi=max{fj+[ai=aj]×ai+si1sj+1}

发现只有相同元素会产生贡献,于是用桶维护相同元素的最优决策点。

即: b u c a i = max ⁡ { f j − s j + 1 } buc_{a_i} = \max\{f_j - s_{j + 1}\} bucai=max{fjsj+1}

有转移:
f i = max ⁡ { b u c a i + a i + s i − 1 } f_i = \max\{buc_{a_i} + a_i + s_{i - 1}\} fi=max{bucai+ai+si1}

(虽然但是,我用的是一种更难理解,但是更好写的代码)

AC-code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int rd() {int x = 0, w = 1;char ch = 0;while (ch < '0' || ch > '9') {if (ch == '-') w = -1;ch = getchar();}while (ch >= '0' && ch <= '9') {x = x * 10 + (ch - '0');ch = getchar();}return x * w;
}
void wt(int x) {static int sta[35];int f = 1;if(x < 0) f = -1,x *= f;int top = 0;do {sta[top++] = x % 10, x /= 10;} while (x);if(f == -1) putchar('-');while (top) putchar(sta[--top] + 48);
}namespace work{
const int N = 2e5+5,M = 1e6 + 5;
int n,a[M],s[M],f[M],t[M];
void solve() {memset(s,0,sizeof(s));memset(t,0,sizeof(t));memset(f,0,sizeof(f));n = rd();for(int i = 1;i<=n;i++) a[i] = rd();for(int i = 2;i<=n;i++) s[i] = s[i - 1] + (a[i] == a[i - 1]) * a[i];for(int i = 1;i<=n;i++) {f[i] = f[i - 1];if(t[a[i]]) f[i] = max(f[i],f[t[a[i]] + 1] + a[i] + s[i] - s[t[a[i]] + 1]);t[a[i]] = i;}wt(f[n]);putchar('\n');
}}signed main() {int T = rd();while(T--) work::solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464089.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<项目代码>YOLOv8 猫狗识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件&#xff0c;如下&#xff1a; 1.2 添加 CSV数据文件设置 &#xff0c;如下&#xff1a; 1.3 接口请求体设置变量&#xff0c;如下&#xff1a; 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…

哔哩哔哩车机版2.7.0|专为司机打造的车机版B站,内容丰富,功能齐全

哔哩哔哩车机版是一款专为司机朋友们打造的车机版应用&#xff0c;扫码登录即可使用。该软件让你通过耳朵了解最新的游戏、动画动漫信息&#xff0c;感受其独特的趣味性内容。车机版亮点包括二次元和三次元的鬼畜视频、原创和翻唱音乐、前沿科技科普、国内外优秀舞蹈作品等。软…

在Mac下安装时间序列软件Hector

1.软件介绍 Hector 是一款开源软件&#xff0c;专用于 GNSS 时间序列数据的处理与分析&#xff0c;广泛应用于地球科学研究。它帮助研究人员从 GNSS 数据中提取长期趋势、周期性成分&#xff0c;并建模噪声特性&#xff0c;用于地壳形变、地震影响和气候变化等方面的研究。Hec…

opencv python笔记

OpenCV课程 OpenCV其实就是一堆C和C语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。 OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中…

Rust 力扣 - 2461. 长度为 K 子数组中的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;用一个哈希表记录窗口内的所有元素&#xff08;用来对窗口内元素去重&#xff09;&#xff0c;我们取哈希表中元素数量等于k的窗口总和的最大值 题解代码 use std::collecti…

[实战-11] FlinkSql 设置时区对TIMESTAMP和TIMESTAMP_LTZ的影响

table.local-time-zone table.local-time-zoneDataStream-to-Table Conversion&#xff08;拓展知识&#xff09;代码测试flinksql代码执行结果截图1. Asia/Shanghai 结果如下2. UTC结果如下 table.local-time-zone table.local-time-zone可用于设置flinksql的时区。 flink的内…

rnn/lstm 项目实战

tip:本项目用到的数据和代码在https://pan.baidu.com/s/1Cw6OSSWJevSv7T1ouk4B6Q?pwdz6w2 1. RNN : 预测股价 任务&#xff1a;基于zgpa_train.csv数据,建立RNN模型,预测股价 1.完成数据预处理&#xff0c;将序列数据转化为可用于RNN输入的数据 2.对新数据zgpa_test.csv进…

MySQL超大分页怎么优化处理?limit 1000000,10 和 limit 10区别?覆盖索引、面试题

1. limit 100000,10 和 limit 10区别 LIMIT 100000, 10&#xff1a; 这个语句的意思是&#xff0c;从查询结果中跳过前100000条记录&#xff0c;然后返回接下来的10条记录。这通常用于分页查询中&#xff0c;当你需要跳过大量的记录以获取后续的记录时。例如&#xff0c;如果你…

规范:项目、目录、文件、样式、事件、变量、方法、url参数、注释、git提交 命名规范及考证

一、规范命名的重要性 易懂、通用、规范、标准、专业性、是经验积累的体现 1.1、常见命名方法 序号命名方法解释1全小写2全大写3驼峰&#xff1a;小驼峰命名法4驼峰&#xff1a;大驼峰命名法5烤串命名法 / 脊柱命名法6下划线分隔法 二、项目名 采用小写字母和中划线&#…

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray&#xff0c;它是一系列同类型数据的集合&#xff0c;以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

二:MySQL基础---查询专项练习

目录 表结构 1. 数据月表&#xff08;zbr_data_monthly_data_YYYYMM&#xff09; 2. 分类表&#xff08;zbr_category&#xff09; 3. 用户表&#xff08;zbr_user&#xff09; 4. 交易表&#xff08;zbr_transaction&#xff09; 查询知识点 1. 基本查询 2. 连接查询 …

C++线程异步

本文内容来自&#xff1a; 智谱清言 《深入应用C11 代码优化与工程级应用》 std::future std::future作为异步结果的传输通道&#xff0c;可以很方便地获取线程函数的返回值。 std::future_status Ready (std::future_status::ready): 当与 std::future 对象关联的异步操作…

Python小游戏19——滑雪小游戏

运行效果 python代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("滑雪小游戏") # 定义颜色 WH…

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…

04字符串算法/代码随想录

四、字符串 反转字符串 力扣344 遇到数组双指针真是太好用了&#xff0c;左右指针不断逼近即可&#xff0c;代码也很简单 class Solution {public void reverseString(char[] s) {int fast s.length - 1;int slow 0;while (slow < fast) {char temp s[fast];s[fast] s[…

conda找不到对应版本的pytorch,就会自动下载cpu版本的

踩坑一&#xff1a; conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia (本人的服务器支持的 且python3.8.20) 先nvidia-smi查看自己cuda支持的最高版本&#xff0c;然后去pytorch官网寻找对应的torch、torchaudio、to…

信息学科平台设计与实现:Spring Boot技术详解

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

文章目录 零、前言一、应用层协议原理1.1 网络应用的体系结构1.1.1 客户-服务器(C/S)体系结构1.1.2 对等体&#xff08;P2P&#xff09;体系结构1.1.3 C/S 和 P2P体系结构的混合体 1.2 进程通信1.2.1 问题1&#xff1a;对进程进行编址&#xff08;addressing&#xff09;&#…

Java面向对象 C语言字符串常量

1. &#xff08;1&#xff09;. package liujiawei;public class Phone {String brand;double price;public void call(){System.out.println("手机打电话");}public void play(){System.out.println("手机打游戏");} } public class phonetest {public…