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 --> <…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...