2025 ICPC网络赛第一场 L cover

news/2025/9/19 10:11:26/文章来源:https://www.cnblogs.com/mod998244353/p/19100212

给一个长度为 \(n\) 的序列 \(\{a_n\}\)\(m\) 个操作,其中第 \(i\) 个操作是把区间 \([l_i,r_i]\) 都赋值为 \(c_i\)

现在按顺序遍历每个操作,每个操作可执行可不执行。

最大化序列的颜色段数,即 \(1+\sum\limits_{i=2}^n[a_{i-1}\not=a_i]\)

\(1\leq a_i,c_i\leq n\leq\sum n\leq3\times10^5,1\leq m\leq\sum m\leq3\times10^5\)

\(\forall 1\leq i<j\leq n,[l_j,r_j]\nsubseteq [l_i,r_i]\)

首先,设 \(f_n\) 表示只考虑前 \(i\) 项且第 \(i\) 项保留原本值时最大颜色段数。

\(a_0=a_{n+1}=0\),答案就是 \(f_{n+1}-1\)

有转移方程 \(f_{i}=\max\{f_{i-1}+[a_i\not=a_{i-1}],\max\limits_{0\leq j<i-1}\{f_j+\text{maxcolor}(j,i)\}\}\)

其中 \(\text{maxcolor}(j,i)\) 表示当 \(a_j,a_i\) 都保留原本值时 \([j+1,i]\) 贡献的颜色段数的最大值。

显然 \(\text{maxcolor}(j,i)\) 并不能直接用式子表示。

\(g_i\) 表示第 \(i\) 个操作执行且 \(a_{r_i}\) 最终被第 \(i\) 次操作覆盖时 \([1,r_i]\) 的最大颜色段数。

更新我们的转移方程:

\(f_i=\max\{f_{i-1}+[a_i\not=a_{i-1}],\max\limits_{r_j=i-1}\{g_j+[c_j\not=a_i]\}\}\)

\(g_i=\max\{f_{l_i-1}+[c_i\not=a_{l_i-1}],\max\limits_{0\leq j<i,r_j\leq r_i}\{g_j+[c_j\not=c_i]\},\max\limits_{i<j\leq m,r_j<r_i}\{g_j+[c_j\not=c_i]\}\}\)

使用线段树优化即可做到 \(O(n+m\log m)\)

#include<bits/stdc++.h>
using namespace std;
const int MAXN=300005,inf=1e9;
const pair<int,int> Inf=make_pair(-inf,-1);
inline int read() {static int x=0,c=getchar(),f=1;for(f=1; c<=47||c>=58; c=getchar())f=f&&(c^45);for(x=0; c>=48&&c<=57; c=getchar())x=(x<<3)+(x<<1)+(c&15);return f?x:-x;
}
struct node {pair<int,int>a,b;inline node(pair<int,int>A=Inf,pair<int,int>B=Inf) {a=A,b=B;}
};
inline node Merge(node x,node y) {static node z;z.a=max(x.a,y.a),z.b=Inf;if(x.a.second!=z.a.second) z.b=x.a;if(y.a.second!=z.a.second) z.b=max(z.b,y.a);if(x.b.second!=z.a.second) z.b=max(z.b,x.b);if(y.b.second!=z.a.second) z.b=max(z.b,y.b);return z;
}
struct Tree {node val,tg;
} tr[MAXN<<2];
void build(int num,int l,int r) {tr[num].val=tr[num].tg=node();if(l==r)return;build(num<<1,l,(l+r)>>1),build(num<<1|1,(l+r+2)>>1,r);
}
inline void Tag(int num,node x) {if(~x.a.second) {tr[num].tg=Merge(tr[num].tg,x);static node p;p=tr[num].val;if(~p.a.second) {tr[num].val=Merge(tr[num].val,node(make_pair(x.a.first+(x.a.second!=p.a.second),p.a.second)));if(~x.b.second)tr[num].val=Merge(tr[num].val,node(make_pair(x.b.first+(x.b.second!=p.a.second),p.a.second)));if(~p.b.second) {tr[num].val=Merge(tr[num].val,node(make_pair(x.a.first+(x.a.second!=p.b.second),p.b.second)));if(~x.b.second)tr[num].val=Merge(tr[num].val,node(make_pair(x.b.first+(x.b.second!=p.b.second),p.b.second)));}}}
}
void push_down(int num) {if(~tr[num].tg.a.second) {Tag(num<<1,tr[num].tg);Tag(num<<1|1,tr[num].tg);tr[num].tg=node();}
}
void upd(int num,int l,int r,int x,node v) {if(l==r) {tr[num].val=v;return;}push_down(num);int mid=(l+r)>>1;if(x<=mid)upd(num<<1,l,mid,x,v);else upd(num<<1|1,mid+1,r,x,v);tr[num].val=Merge(tr[num<<1].val,tr[num<<1|1].val);
}
void update(int num,int l,int r,int L,int R,node x) {if(L>R)return;if(L<=l&&r<=R) return Tag(num,x);push_down(num);int mid=(l+r)>>1;if(L<=mid) update(num<<1,l,mid,L,R,x);if(mid<R)update(num<<1|1,mid+1,r,L,R,x);tr[num].val=Merge(tr[num<<1].val,tr[num<<1|1].val);
}
node query(int num,int l,int r,int L,int R) {if(L>R)return Inf;if(L<=l&&r<=R)return tr[num].val;push_down(num);int mid=(l+r)>>1;if(R<=mid) return query(num<<1,l,mid,L,R);if(mid<L)return query(num<<1|1,mid+1,r,L,R);return Merge(query(num<<1,l,mid,L,mid),query(num<<1|1,mid+1,r,mid+1,R));
}
int n,m,a[MAXN],col[MAXN],f[MAXN];
vector<int>add[MAXN],del[MAXN];
vector<node>vec;
inline void solve() {n=read(),m=read(),a[n+1]=0;for(int i=1; i<=n; ++i)a[i]=read();for(int i=1; i<=m; ++i) {add[read()].push_back(i);del[read()+1].push_back(i);col[i]=read();}build(1,1,m);for(int i=1; i<=n+1; ++i) {f[i]=f[i-1]+(a[i]!=a[i-1]);vec.clear();for(int x:add[i])vec.push_back(query(1,1,m,1,x-1));for(int x:add[i])upd(1,1,m,x,node(make_pair(-inf,col[x])));for(unsigned j=0; j<vec.size(); ++j)update(1,1,m,add[i][j],add[i][j],Merge(node(make_pair(f[i-1],a[i-1])),vec[j]));vec.clear();for(int x:del[i]) {vec.push_back(query(1,1,m,x,x));f[i]=max(f[i],vec.back().a.first+(col[x]!=a[i]));upd(1,1,m,x,node());}for(unsigned j=0; j<vec.size(); ++j)update(1,1,m,1,del[i][j],node(vec[j].a));add[i].clear(),add[i].shrink_to_fit();del[i].clear(),del[i].shrink_to_fit();}printf("%d\n",f[n+1]-1);
}
int main() {int t=read();while(t--)solve();return 0;
}

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

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

相关文章

实用指南:22 C++11 初始化新姿势:{} 统一初始化(省等号)+initializer_list 底层解析

实用指南:22 C++11 初始化新姿势:{} 统一初始化(省等号)+initializer_list 底层解析2025-09-19 10:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important;…

第九届电气、机械与计算机工程国际学术会议(ICEMCE 2025)

第九届电气、机械与计算机工程国际学术会议(ICEMCE 2025) 2025 9th International Conference on Electrical, Mechanical and Computer Engineering ICEMCE系列会议属一年一度的国际学术会议,因其影响力及重要性,…

第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025)

第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025) 2025 6th International Conference on Big Data, Artificial Intelligence and Internet of Things Engineering 第六届大数据、人工智能与物联网工程国际…

文件自动同步软件用哪个好,高效选择指南

内容概要 在数字化办公日益普及的今天,文件自动同步软件已成为提升团队协作效率的重要工具。面对市场上琳琅满目的选择,“文件自动同步软件用哪个好”成为了许多企业IT管理者和个人用户共同关注的问题。本指南将深入…

【初赛】指针 - Slayer

指针的性质是理解其行为和使用方式的核心,主要包括以下几个方面: 1. 指针是存储地址的变量 指针的本质是一个变量,但其存储的不是数据本身,而是另一个变量(或内存单元)的内存地址。例如:int a = 10; int* p = &…

国产化FPGA-2050-基于JFMK50T4(XC7A50T)的核心板

基于JFMK50T4(XC7A50T)的核心板(IEB-PS-3051-邮票孔) 一、核心板概述板卡基于JFMK50T4国产化FPGA芯片,设计的一款工业级核心板,板卡集成主芯片、电源、DDR、配置芯片,大大减轻客户的扩展开发困难。丰富的IO和…

hbase学习2

一、表管理操作创建表 hbase create 表名, 列族1, 列族2, ...示例:创建student表,有info和score两个列族 create student, info, score 2. 查看所有表 hbase list 3. 查看表描述 hbase describe 表名 describe stude…

exl 表格手动导入mysql

exl 表格手动导入mysql数据如,有一份exl表格如何整理成导入的sql A 35 =A2&B2 ="""&"&C2&"&"""&"," ="""&if("…

基于Python+Vue开发的健身房管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的健身房管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于P…

技术圈的“绯闻女孩”:Gossip是如何把八卦秘密传遍全网的?

技术圈的“绯闻女孩”:Gossip是如何把八卦秘密传遍全网的?Gossip协议,中文可译为“流言蜚语”“闲话”或“八卦”,形象地描述了该协议的工作方式——类似于人类社会中的信息传播模式。Gossip协议最早由Xerox公司的…

2025年纷享销客生态伙伴大会无锡站圆满举办!

近日,2025年纷享销客生态伙伴大会(无锡站)成功举办。大会以“智享未来,领创 CRM 新纪元”为主题,吸引了众多生态伙伴齐聚一堂,共话 CRM 行业新趋势,共探 AI 赋能下的客户经营新范式。一、数智化浪潮下的CRM变革…

英语_阅读_digital technology_待读

These days, digital technology is everywhere in our lives.如今,数字科技无处不在地出现在我们的生活中。 From smartphones to tablets, we use digital devices every day at school, at home and when hanging …

达梦 两个bug json 导致数据库crash 和 优化器解析or 导致结果不一样

##sample1 无法解析 json 数据库直接crash. 分析函数,定位到BUG 升级数据库软件,问题得到规避 ########sample 2 优化器解析or 导致结果不一样--测试1 原有的查询顺序,查到空行。 SQL> SELECT coltablename,…

MySQL迁移至GreatSQL后,timestamp字段插入报错解析

MySQL迁移至GreatSQL后,timestamp字段插入报错解析 背景描述 某业务系统进行国产化适配,将MySQL的数据迁移到 GreatSQL 后,执行 INSERT INTO ,update_time传参为空时报错,报错信息为:ERROR 1048 (23000): Column u…

2025年文件摆渡系统哪个品牌好推荐

内容概要 在寻找文件摆渡系统的过程中,企业往往关心哪个品牌能够更好地满足其安全、高效的数据交换需求。2025年,市场上涌现出众多品牌,但“文件摆渡系统哪个品牌好”这一问题,不少企业给出了共同的答案——Ftrans…

DevExpress WPF中文教程:DataGrid - 服务器数据和大型数据源

DevExpress WPF中文教程:DataGrid - 服务器数据和大型数据源DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程…

VU9P板卡设计方案:565-基于VU9P的32@ SFP28+4@ QSFP28路光纤交换板卡

、板卡概述 板卡基于Xilinx FPGA VU9P 设计的一款32路SFP28+4路QSFP28的光纤交换板卡,用于以太网的交换功能的验证。 二、板卡原理框图三、板卡主要性能 ● 主芯片:选用 XCVU9P-2FLGB2104I(702, 76)47.5*47.5 ● 3…

Python中使用列表、map和filter函数配合lambda表达式来操作集合

在 Python 中,map()、filter() 和 lambda 表达式是处理集合(如列表)的常用工具,可以快速实现 转换 和 过滤 操作。以下是具体示例:1. map() 函数:对列表元素进行转换 作用: 对列表的每个元素应用一个函数,返回…

深入解析:SSM商品导向型模特管理系统-计算机毕业设计源码01876

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大模型decoder中权重矩阵的理解 - 实践

大模型decoder中权重矩阵的理解 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…