CAP5_Monday
A Set to Max (Easy Version)
给定数组 a 和 b,可以执行以下操作任意次 :
让 a l ∼ a r a_l\sim a_r al∼ar 中的所有所有元素变成 a i a_i ai ( l ≤ i ≤ r ) (l\leq i\leq r) (l≤i≤r), 其中 1 ≤ l ≤ r ≤ n 1\leq l \leq r \leq n 1≤l≤r≤n
显然, 必须满足任意 a i ≤ b i a_i\leq b_i ai≤bi , 否则无解。
从 1 到 n 遍历 a[i],
如果 a[i] = b[i], continue;
否则, a[i] < b[i]
必须从 [1, n] 中寻找 mx = b[i], 设 mx_pos = j > i
则 b[i, mx_pos] = b[i] 才能更换
也就以 b 为节点扩展 ???
1 2 3 2 4
1 3 3 2 4
遍历 b 似乎更优秀,
1 = 1 ,下一个
3 > 2,
寻找 a[j] = 3 了 & 途中没出现更大的数 & 途中 b j b_j bj 全部等于 b i b_i bi
2 = 2
4 = 4
YES
3 4 2 2 4
3 4 3 4 4
3 = 3
4 = 4
3 > 2
下一个 下一个 b i ≠ 3 b_i\neq 3 bi=3
NO
3 2 1 1 1
3 3 3 2 2
3 = 3
3 > 2
下一个 b j = 3 b_j=3 bj=3 & a j < 3 a_j<3 aj<3
还可以向左边找
我们双指针预处理所有的 b i b_i bi 相同块
【3 2 1】【1 1】
【3 3 3】【2 2】
块中的 a i a_i ai 最大值 = b 即可
还是错了,应该从值最小的块操作,以 【2 2】为例,查询到所有的 2 , 统一修改即可
3 2 2 2 2
3 3 3 2 2
1 1
1 2
NO
1 1 2
2 1 2
不能跨越已经修改的元素
NO
综上,按值大小预处理离出来每个相同块加入 vector
, 从小到大遍历, s t st st 维护一个块是否已经铆定,也就是是否还接受修改;对于每个查询修改,先遍历 [l, r] 看看有没有对应元素,有就直接修改,没有的话先左在右,实在不行在 return false
猜想确实是对的,但是 O ( n 2 ) O(n^2) O(n2) 的时间复杂度不足以通过 H a r d Hard Hard 版本
B Set To Max (Hard Version)
这是 easy
版本的 ac code
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, a[1100], b[1100];
vector<pair<int, int> > seg[1100];
bool st[1100];
void solve(){cin >> n;for(int i = 1; i <= n; i ++){st[i] = false;seg[i].clear();}for(int i = 1; i <= n; i ++){cin >> a[i];}for(int i = 1; i <= n; i ++){cin >> b[i];}for(int i = 1; i <= n; i ++){if(a[i] > b[i]){cout << "NO\n";return ;}}for(int i = 1; i <= n; i ++){int j = i;while(j <= n && b[j] == b[i]) j ++;j --;seg[b[i]].push_back({i, j});i = j;}// for(int i = 1; i <= n; i ++){// if(seg[i].size()==0) continue;// cout<<i<<": \n";// for(auto [l, r] : seg[i]){// cout<<l<<' '<<r<<'\n';// }// }for(int v = 1; v <= n; v ++){if(seg[v].size() == 0) continue;for(auto [l, r] : seg[v]){int val = b[l];bool fg = false;for(int k = l; k <= r; k ++){if(a[k] == val) fg = true;}if(fg){for(int k = l; k <= r; k ++){st[k] = true; // 不再修改// cout<<"k: "<<k<<'\n';}continue;}else{for(int i = l - 1; i >= 1; i --){if(st[i] == true || a[i] > val){break;}if(a[i] == val){fg = true;for(int u = l; u <= r; u ++) st[u] = true;break;}}for(int i = r + 1; !fg && i <= n; i ++){if(st[i] == true || a[i] > val){break;}if(a[i] == val){fg = true;for(int u = l; u <= r; u ++) st[u] = true;break;}}if(fg == false){cout << "NO\n";return ;}}}}cout << "YES\n";
}signed main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T --){solve();}return 0;
}
// 1
// 25// 7 2 2 6 8 6 3 1 11 7 13 3 9 5 1 17 3 7 11 4 2 2 9 8 2
// 7 8 8 8 11 13 13 13 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 2// st[25] = true
// st[1] = true
复杂度较为集中的区域是查询以及区间修改为 true
区间查询的是区间 mx, 这时可以维护一个线段树,线段树里面维护 st 数组,每次修改为 true 就是区间修改 1, 然后查找对应的 val 值的过程,查 st 用二分,查 mx 也用二分
查 st 的二分, 就是确定 mx 二分的边界, 看看 mx 从 [l, r] 往左查和往右查能不能查到 mx
但这题绝对不会这么复杂,维护区间修改 + 查询区间和 + 求区间 mx 的线段树略显复杂(不难但我不会),但是是一种可行的做法
从小到大枚举块,每个块覆盖的 a i a_i ai ,
对于第一个块,可以选择 从 [1, n] 里面查找 val
维护区间查询 mx, map 映射快速查询 val 的位置,首先自己查自己的 [l, r] 区间加起来是 O(n) 的可以接受;每个点只会被修改为 true
一次,同样是 O ( n ) O(n) O(n) 的。
只用看看 [lpos, l-1] 和 [r+1, rpos] 之间有没有 st = true 的即可
这样还是很好写的,维护一个 set 存 st=true 的位置即可,在 st 里面二分看看最近的非法位置 ??
只需要 STl 就能实现,不需要额外的手写的复杂数据结构
我发现自己的代码忽略了一个致命问题,就是
只用看看 [lpos, l-1] 和 [r+1, rpos] 之间有没有 st = true 的即可
这句话部分对了,还要查看这里面有没有比 val 大的,还要维护操蛋的数据结构
已经2024年4月15日22:05:20了,明天直接看题解补题把
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, a[1100], b[1100];
vector<pair<int, int> > seg[1100];
// bool st[1100];
set<int> pos[200010]; // 值 i 的 pos
void solve(){set<int> st = set<int> (); // 维护 truecin >> n;for(int i = 1; i <= n; i ++){// st[i] = false;seg[i].clear();pos[i].clear();}for(int i = 1; i <= n; i ++){cin >> a[i];pos[a[i]].insert(i);}for(int i = 1; i <= n; i ++){cin >> b[i];}for(int i = 1; i <= n; i ++){if(a[i] > b[i]){cout << "NO\n";return ;}}for(int i = 1; i <= n; i ++){int j = i;while(j <= n && b[j] == b[i]) j ++;j --;seg[b[i]].push_back({i, j});i = j;}// for(int i = 1; i <= n; i ++){// if(seg[i].size()==0) continue;// cout<<i<<": \n";// for(auto [l, r] : seg[i]){// cout<<l<<' '<<r<<'\n';// }// }for(int v = 1; v <= n; v ++){if(seg[v].size() == 0) continue;for(auto [l, r] : seg[v]){int val = b[l];bool fg = false;for(int k = l; k <= r; k ++){ // 内部查询暴力查if(a[k] == val) fg = true;}if(fg){for(int k = l; k <= r; k ++){st.insert(k);pos[a[k]].erase(k);pos[val].insert(k);// st[k] = true; // 不再修改// cout<<"k: "<<k<<'\n';}continue;}else{// 从左边用 set::pos 快速查询if(pos[val].size() == 0){cout << "NO\n";return ;}if(*pos[val].begin() < l){auto it = pos[val].lower_bound(l);it = prev(it); // =val 最接近 l 的元素// cout << "*it: " << (*it) << '\n';// cout << *st.lower_bound(*it) << '\n';if(st.size()==0 || *st.lower_bound(*it) < (*it)){fg = true;for(int k = l; k <= r; k ++){st.insert(k);pos[a[k]].erase(k);pos[val].insert(k);// st[k] = true; // 不再修改// cout<<"k: "<<k<<'\n';}}} if(fg == false){auto it = pos[val].lower_bound(r);if(it != pos[val].end()){if(st.size()==0 || *st.lower_bound(r) > *it){fg = true;for(int k = l; k <= r; k ++){st.insert(k);pos[a[k]].erase(k);pos[val].insert(k);// st[k] = true; // 不再修改// cout<<"k: "<<k<<'\n';}}}}if(fg == false){cout << "NO\n";return ;}}}}cout << "YES\n";
}signed main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int T = 1;cin >> T;while (T --){solve();}return 0;
}
// 1
// 25// 7 2 2 6 8 6 3 1 11 7 13 3 9 5 1 17 3 7 11 4 2 2 9 8 2
// 7 8 8 8 11 13 13 13 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 2// st[25] = true
// st[1] = true
相关文章:
CAP5_Monday
A Set to Max (Easy Version) 给定数组 a 和 b,可以执行以下操作任意次 : 让 a l ∼ a r a_l\sim a_r al∼ar 中的所有所有元素变成 a i a_i ai ( l ≤ i ≤ r ) (l\leq i\leq r) (l≤i≤r), 其中 1 ≤ l ≤ r ≤ n 1\leq l \leq r \leq n 1≤…...

科大讯飞星火开源大模型iFlytekSpark-13B GPU版部署方法
星火大模型的主页:iFlytekSpark-13B: 讯飞星火开源-13B(iFlytekSpark-13B)拥有130亿参数,新一代认知大模型,一经发布,众多科研院所和高校便期待科大讯飞能够开源。 为了让大家使用的更加方便,科…...

SpringBoot基于RabbitMQ实现消息延迟队列方案
知识小科普 在此之前,简单说明下基于RabbitMQ实现延时队列的相关知识及说明下延时队列的使用场景。 延时队列使用场景 在很多的业务场景中,延时队列可以实现很多功能,此类业务中,一般上是非实时的,需要延迟处理的&a…...
Go语言使用标准库时常见错误
Go的标准库是一组增加和拓展语言的核心包。然而,很容易误用标准库,或者我们对其行为理解有限,导致产生了bug或不应该在生产级应用程序中某些功能。 1. 提供错误的持续时间 标准库提供了获取 time.Duration 的常用函数和方法,但由于 time.Duration 是 int64 的自定义类型,…...

UE5不打包启用像素流 ubuntu22.04
首先查找引擎中像素流的位置: zkzk-ubuntu2023:/media/zk/Data/Linux_Unreal_Engine_5.3.2$ sudo find ./ -name get_ps_servers.sh [sudo] zk 的密码: ./Engine/Plugins/Media/PixelStreaming/Resources/WebServers/get_ps_servers.sh然后在指定路径中…...
Redis 常用数据类型常用命令和应用场景
首先先混个眼熟 Redis 中的 8 种常用数据类型: 5 种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合࿰…...

ins视频批量下载,instagram批量爬取视频信息
简介 Instagram 是目前最热门的社交媒体平台之一,拥有大量优质的视频内容。但是要逐一下载这些视频往往非常耗时。在这篇文章中,我们将介绍如何使用 Python 编写一个脚本,来实现 Instagram 视频的批量下载和信息爬取。 我们使用selenium获取目标用户的 HTML 源代码,并将其保存…...
Canvas图形编辑器-数据结构与History(undo/redo)
Canvas图形编辑器-数据结构与History(undo/redo) 这是作为 社区老给我推Canvas,于是我也学习Canvas做了个简历编辑器 的后续内容,主要是介绍了对数据结构的设计以及History能力的实现。 在线编辑: https://windrunnermax.github.io/CanvasEditor开源地…...

阿里云Centos7下编译glibc
编译glibc 原来glibc版本 编译前需要的环境: CentOS7 gcc 8.3.0 gdb 8.3.0 make 4.0 binutils 2.39 (ld -v) python 3.6.8 其他看INSTALL, 但有些版本也不易太高 wget https://mirrors.aliyun.com/gnu/glibc/glibc-2.37.tar.gz tar -zxf glibc-2.37.tar.gz cd glibc-2.37/ …...

UE5数字孪生系列笔记(四)
场景的切换 创建一个按钮的用户界面UMG 创建一个Actor,然后将此按钮UMG添加到组件Actor中 调节几个全屏的背景 运行结果 目标点切换功能制作 设置角色到这个按钮的位置效果 按钮被点击就进行跳转 多个地点的切换与旋转 将之前的目标点切换逻辑替换成旋转的逻…...

品牌故事化:Kompas.ai如何塑造深刻的品牌形象
在这个信息爆炸的时代,品牌故事化已经成为企业塑造独特形象、与消费者建立情感联系的重要手段。一个引人入胜的品牌故事不仅能够吸引消费者的注意力,还能够在消费者心中留下持久的印象,建立起强烈的情感连接。本文将深入探讨品牌故事化对于构…...
5g和2.4g频段有什么区别
运行的频段不同 2.4G和5G频段的主要区别在于它们运行的频段不同,2.4G频段运行在2.4GHz的频段上,而5G频段(这里指的是5GHz频段)运行在5GHz的频段上。12 这导致了两者在传输速度、覆盖范围、抗干扰能力等方面的明显差异。以下是详…...

交通管理在线服务系统|基于Springboot的交通管理系统设计与实现(源码+数据库+文档)
交通管理在线服务系统目录 目录 基于Springboot的交通管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、驾驶证业务管理 3、机动车业务管理 4、机动车业务类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计…...
konva.js 工具类
konva.js 工具类 class KonvaCanvas {/*** 初始化画布* param {String} domId 容器dom id*/constructor(domId) {this.layer null;this.stage null;this.scale 1;this.init(domId);}/*** 聚焦到指定元素* param {String} elementId 元素dom id*/focusOn(elementId) {if (!t…...

php未能在vscode识别?
在设置里搜php,找到settings.json,设置你的安装路径即可。 成功...

解读MongoDB官方文档获取mongo7.0版本的安装步骤与基本使用
mongo式一款NOSQL数据库,用于存储非结构化数据,mongo是一种用于存储json的数据数据,可以通过mongo提供的命令解析json获取想要的值。 数据模型 了解关系数据库会很熟悉database,table,row,column的概念,分别是数据库,…...

【数据结构|C语言版】顺序表
前言1. 初步认识数据结构2. 线性表3. 顺序表3.1 顺序表的概念3.1 顺序表的分类3.2 动态顺序表的实现 结语 前言 各位小伙伴大家好!小编来给大家讲解一下数据结构中顺序表的相关知识。 1. 初步认识数据结构 【概念】数据结构是计算机存储、组织数据的⽅式。 数据…...

Unity类银河恶魔城学习记录12-17 p139 In game UI源代码
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI.cs using UnityEngine;public class UI : MonoBehaviour {[SerializeFie…...

MongoDB学习【一】MongoDB简介和部署
MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统,由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求,提供高可用性、横向扩展能力和灵活的数据模型。 主要特点: 文档模型: Mon…...

html 引入vue Element ui 的方式
第一种:使用CDN的方式引入 <!--引入 element-ui 的样式,--> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/index.css"> <!-- 必须先引入vue, 后使用element-ui --> <…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...