[CF1687C] Sanae and Giant Robot 题解

news/2025/1/14 21:25:21/文章来源:https://www.cnblogs.com/laoshan-plus/p/18671730

[CF1687C] Sanae and Giant Robot

并查集?不,这是一道奇妙的转化题。

首先,设 \(c_i=a_i-b_i\),则原题操作转化为:当某个 \([l_i,r_i]\) 满足 \(\sum_{j=l_i}^{r_i}c_j=0\) 时,可以将 \(c_{l_i\sim r_i}\) 清零。目标是让 \(c_i\) 全部清零。

第二步,观察到第一步中的 \(\sum_{j=l_i}^{r_i}c_j\) 是连续子段和的形式,考虑构造前缀和。设 \(s_i=\sum_{j=1}^ic_j\)。则原题操作转化为:当某个 \(s_{l_i-1}=s_{r_i}\) 时,可以将 \(s_{l_i\sim r_i}\) 全部赋值为 \(s_{r_i}\),目标仍是让 \(s_i\) 全部清零。

第三步,注意到因为目标是清零 \(s_i\),所以如果 \(s_{l_i-1}=s_{r_i}\ne0\),操作是不优的,我们只应在 \(s_{l_i-1}=s_{r_i}=0\) 时操作。

现在原题变得很简单了。我们处理出 \(s_i\) 后,每次找一对 \(s_{l_i-1}=s_{r_i}=0\),然后清零 \(s_{l_i\sim r_i}\),直到不能再操作为止。最终若 \(s_i\) 全部清空,则为 YES;反之则为 NO

具体维护方面,用一个 set 维护所有 \(s_i\ne0\)\(i\),用一个 queue 维护所有 \(s_i=0\)\(i\),用一个 vector 记录下来所有 \(l-1,r\) 的相对关系。从 queue 中取出一个 \(s_i=0\) 的点 \(i\),遍历所有和 \(i\) 相连的点 \(j\),若 \(s_j=0\) 则清空 set 中 \([i,j]\) 的元素,最后检查 set 是否为空即可。

#include<bits/stdc++.h>
using namespace std;using ll=long long;
constexpr int MAXN=2e5+5;
int T,n,m,a[MAXN],b[MAXN];
ll s[MAXN];
vector<int>g[MAXN];
set<int>st;
queue<int>q;int main(){cin.tie(nullptr)->sync_with_stdio(0);cin>>T;while(T--){cin>>n>>m;st.clear();q.emplace(0);for(int i=0;i<=n;++i) g[i].clear();for(int i=1;i<=n;++i) cin>>a[i];for(int i=1;i<=n;++i){cin>>b[i];s[i]=s[i-1]+a[i]-b[i];if(s[i]) st.emplace(i);else q.emplace(i);}for(int i=1,u,v;i<=m;++i){cin>>u>>v;g[u-1].emplace_back(v);g[v].emplace_back(u-1);}while(!q.empty()){int u=q.front();q.pop();for(auto v:g[u]){if(s[v]) continue;int l=min(u,v),r=max(u,v);for(auto it=st.lower_bound(l);it!=st.end()&&*it<=r;it=st.erase(it))s[*it]=0,q.emplace(*it);}}cout<<(st.empty()?"YES\n":"NO\n");}return 0;
}

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

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

相关文章

PDF Automation文档页面自动化工具

PDF Automation是我用VB6开发的一个PDF文档页面自动化工具。电脑必须安装了Adobe Acrobat才能使用该工具。软件的主要功能包括:文档的拆分 文档的合并 页面的删除 页面的移动 页面的插入等。 软件界面正中央的区域是文档列表,也就是多个PDF文档,最右侧是页面列表,显示当前所…

not_the_same_3dsctf_2016 1

打开ida能看到栈溢出,返回地址填到get_secret函数里面,可以看到get_secret函数是直接读取了flag的,现在就需要把它输出即可。 输出我们可以利用代码里面的printf,因为printf从缓冲区打印出东西需要满足条件,比如有换行符或缓冲区已满或程序正常退出。 这里我们用exit让程序…

JS-35 数组方法_reverse()

reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组 var a =[a,b,c]; a.reverse()//["c","b","a"];

FastGPT及大模型API(Docker)私有化部署指南

本文提供了FastGPT及其相关大模型API的Docker私有化部署指南,旨在简化部署流程并降低设备配置要求。文章重点介绍了优化后的部署配置、推荐使用的部署容器以及部署步骤,确保用户能够在不影响FastGPT功能的前提下,以高效的资源利用实现快速部署。1. **部署优化**:本文首先指…

LCT

1 概述 首先我们需要知道一类问题,在这类问题中我们需要维护一个森林,支持加边和删边操作,然后要求维护树上的一些信息。这类问题称为动态树问题。 而 LCT,即 Link-Cut Tree,就是用于解决动态树问题的一种数据结构。 学习 LCT 之前需要对 Splay 这种平衡树有一定了解,当然…

git整体使用流程

一、场景说明本地有文件 想在github创建一个远程仓库 在本地修改,同时同步到远端二、流程设置用户名和邮箱目的:标识每次提交者的身份 设置全局用户名:git config --global user.name "Your Name" 设置全局邮箱:git config --global user.email "your.email…

【Linux性能】Linux 下利用 Valgrind 进行内存调试

一、概述 Valgrind 是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使用未初始化的内存、非法内存访问等问题。它在 Linux 平台上广泛使用,并且支持下多种处理器架构。 二、Valgrind 的使用 2.1 基本格式 valgrind --tool=memcheck -–…

C#/.NET/.NET Core技术前沿周刊 | 第 21 期(2025年1.6-1.12)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

26. 文件操作

一、数据读写在 PySide6 中对文件和文件夹的进行操作时,主要使用 QFile 类、QFileInfo 类和 QDir 类。我们可以在终端中使用 pip 安装 pyside6 模块。 pip install pyside6在 PySide6 窗口程序对文件或者文件夹进行操作时,不强制要求必须使用 PySide6 中提供的 QFile、QDir 等…

MySQL基础函数使用

DQL中的函数 # 官方函数链接 https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format4.1 单行函数函数都是数据库提前给我们准备好的,所以我们可以直接调用,使用函数可以让指定的列计算出我们需要的数据 单行函数 : 指的是操作一行数据…

【模拟电子技术】06-双极晶体管的结构与放大原理

【模拟电子技术】06-双极晶体管的结构与放大原理图(b)中我们可以看到三个区的分类,发射区之所以为发射区是因为掺杂浓度高,才能发射电子出去。而集电区掺杂浓度低,就好比我们想让一个房间当作仓库,那么它的空间肯定要大,里面原本不能是放了很多东西。下图NPN晶体管中发射…