【CF】Day59——Codeforces Round 914 (Div. 2) D

D. Set To Max


题目:

 


Easy

思路:

简单题

由于题目的数据给的很小,所以我们可以用 n² 的复杂度过,那我们来观察一下我们应该怎么操作

显然,如果 a[i] > b[i] 时是无法构造的,同时 a[i] = b[i] 时就不用管了,所以我们直接看 a[i] < b[i]

既然我们要使得这一点可以变成 b[i],那么我们向左右两边寻找一下即可,显然第一个 a[j] = b[i] 的点 j 是最优的,因为如果 j 不行,那么之后的点肯定也不符合,所以我们只要向左和向右找是否存在 a[j] = b[i] 的点 j 即可

但是没有什么特殊条件吗?

显然肯定有的,如果遇到了 a[j] > b[i],那我们就不能继续找了,否则到时候会把 a[i] 变成比 b[i] 还大的 a[j],所以肯定不行

那么还有吗?

当然,我们再想想,如果我们向左找的时候遇到一个点有 b[j] < b[i] 会发生什么,如果我们要替换,无论此时 a[j] = b[j] 还是 a[j] < b[j] ,既然我们包括了这个区间,那么最后 a[j] 一定会变成 比b[j] 更大的 b[i],因此我们遇到 b[j] < b[i] 时也要停止

为什么这样找是可行的呢?

因为这一题我们可以按照任意顺序执行,所以我们找到对应的点后只需要从小到大操作即可,虽然这一题并没有让我们输出操作

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"void solve()
{int n;cin >> n;vector<int> a(n), b(n);set<int> ahas;for (int i = 0; i < n; i++){cin >> a[i];ahas.insert(a[i]);}int flag = 0;for (int i = 0; i < n; i++){cin >> b[i];if (a[i] > b[i] || !ahas.count(b[i])){flag = 1;}}if (flag){no;return;}for (int i = 0; i < n; i++){if (a[i] == b[i])continue;int can = 0;for (int j = i- 1; j >= 0; j--){if (a[j] > b[i] || b[j] < b[i])break;if (a[j] == b[i]){can = 1;break;}}for (int j = i + 1; j < n; j++){if (a[j] > b[i] || (a[j] == b[j] && b[j] < b[i]))break;if (a[j] == b[i]){can = 1;break;}}if (!can){no;return;}}yes;
}signed main()
{cin.tie(0)->sync_with_stdio(false);int t = 1;cin >> t;while (t--){solve();}return 0;
}

Hard

思路:

考优化,二分 + ST表

由于困难版 n 变大了,因此我们不能左右依次枚举 j 了,那我们怎么找呢?

我们其实可以将 a[i] 的位置 i 存下来,那我们查找的时候只需要使用二分去 pos[b[i]] 中寻找 第一个大于 i 的位置 j 和 最后一个小于 i 的位置 j

找是找到了,但是那些判断怎么写?

我们观察easy我们找到的条件,第一个是不能存在 b[i] > b[j] 第二个不能存在 a[j] > b[i],所以我们需要快速找到 j ~ i 这个区间的最大值和最小值,只要 MAX 和 MIN 都满足条件,那么其他点肯定也是满足条件的,对于 区间最大值/最小值 (RMQ) 问题,我们可以使用 ST 表 或者 树状数组,这里使用 ST 表实现

至此优化问题就解决了

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
const int MAXN = 2e5 + 10;int lg[MAXN];
int n;
int stMX[MAXN][20], stMI[MAXN][20];
void InitLog()
{lg[1] = 0;for (int i = 2; i <= 2e5; i++)lg[i] = lg[i >> 1] + 1;
}void InitST()
{for (int j = 1; j <= lg[n]; j++){for (int i = 1; i + (1LL << j) - 1 <= n; i++){stMX[i][j] = max(stMX[i][j - 1], stMX[i + (1LL << (j - 1))][j - 1]);stMI[i][j] = min(stMI[i][j - 1], stMI[i + (1LL << (j - 1))][j - 1]);}}
}int getMax(int l,int r)
{int len = lg[r - l + 1];return max(stMX[l][len], stMX[r - (1LL << len) + 1][len]);
}int getMin(int l, int r)
{int len = lg[r - l + 1];return min(stMI[l][len], stMI[r - (1LL << len) + 1][len]);
}int erfengetSmall(int x,vector<int>& pos)
{int l = 0, r = pos.size() - 1;int res = -1;while (l <= r){int mid = l + r >> 1;if (pos[mid] < x){res = mid;l = mid + 1;}else{r = mid - 1;}}return res;
}void solve()
{cin >> n;vector<int> a(n+1), b(n+1);vector<vector<int>> pos(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];stMX[i][0] = a[i];pos[a[i]].push_back(i);}for (int i = 1; i <= n; i++){cin >> b[i];stMI[i][0] = b[i];}InitST();for (int i = 1; i <= n; i++){int flag = 0;if (a[i] == b[i])continue;if (a[i] > b[i]){no;return;}if (!pos[b[i]].empty()){auto it = lower_bound(pos[b[i]].begin(), pos[b[i]].end(), i);if (it != pos[b[i]].end()){int r = *it;if (getMax(i, r) <= b[i] && getMin(i, r) >= b[i]){flag = 1;}}int L = erfengetSmall(i, pos[b[i]]);if (L >= 0){int l = pos[b[i]][L];if (getMax(l, i) <= b[i] && getMin(l, i) >= b[i]){flag = 1;}}}if (!flag){no;return;}}yes;
}signed main()
{InitLog();cin.tie(0)->sync_with_stdio(false);int t = 1;cin >> t;while (t--){solve();}return 0;
}

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

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

相关文章

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- GPT源代码解析

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- GPT源代码解析 我们可以稍微看一下, 这是我们GPT的基于它的源代码产生的可视化的内容。 这边是model ,我们在谈这个sampling的时候,本身首先就是说它这个probability distribution ,会有很多的参数…

AI 推理 | vLLM 快速部署指南

本文是 AI 推理系列的第一篇&#xff0c;近期将更新与 vLLM 的相关内容。本篇从 vLLM 的部署开始&#xff0c;介绍 vLLM GPU/CPU 后端的安装方式&#xff0c;后续将陆续讲解 vLLM 的核心特性&#xff0c;如 PD 分离、Speculative Decoding、Prefix Caching 等&#xff0c;敬请关…

Python-MCPInspector调试

Python-MCPInspector调试 使用FastMCP开发MCPServer&#xff0c;熟悉【McpServer编码过程】【MCPInspector调试方法】-> 可以这样理解&#xff1a;只编写一个McpServer&#xff0c;然后使用MCPInspector作为McpClient进行McpServer的调试 1-核心知识点 1-熟悉【McpServer编…

Linux 常用命令 -hostnamectl【主机名控制】

简介 hostnamectl 命令中的 “hostname” 顾名思义&#xff0c;指的是计算机在网络上的名称&#xff0c;“ctl” 是 “control” 的缩写&#xff0c;意味着控制。hostnamectl 命令用于查询和修改系统主机名以及相关的设置。它通过与 systemd 系统管理器交互&#xff0c;允许用…

力扣-二叉树-101 对称二叉树

思路 分解问题为&#xff0c;该节点的左孩子的左子树和右孩子的右子树是不是同一棵树 && 该节点的左孩子的右字数和右孩子的左子树是不是同一课树 && 该节点的左右孩子的值相不相同 代码 class Solution {public boolean isSymmetric(TreeNode root) {// 层…

Nginx技术方案【学习记录】

文章目录 1. 需求分析1.1 应用场景1.2 实现目标 2. Nginx反向代理与实现均衡负载2.1 部署架构2.2 架构描述2.2.1 Nginx代理服务器2.2.2 API服务器与API服务器&#xff08;Backup&#xff09;2.2.3 nginx.conf配置文件2.2.4 测试方法 3. 高速会话缓存技术3.1 问题背景3.2 使用 R…

Ubuntu22.04怎么退出Emergency Mode(紧急模式)

1.使用nano /etc/fstab命令进入fstab文件下&#xff1b; 2.将挂载项首行加#注释掉&#xff0c;修改完之后使用ctrlX退出; 3.重启即可退出紧急模式&#xff01;

Unity 红点系统

首先明确一个&#xff0c;即红点系统的数据结构是一颗树&#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中&#xff0c;之后再是对应的红点UI侧的注册&#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册&#xff0c;但是不销毁数据侧的红点注册 - …

极新携手火山引擎,共探AI时代生态共建的破局点与增长引擎

在生成式AI与行业大模型的双重驱动下&#xff0c;人工智能正以前所未有的速度重构互联网产业生态。从内容创作、用户交互到商业决策&#xff0c;AI技术渗透至产品研发、运营的全链条&#xff0c;推动效率跃升与创新模式变革。然而&#xff0c;面对AI技术迭代的爆发期&#xff0…

【Redis】SDS结构

目录 1、背景2、SDS底层实现 1、背景 redis作为高性能的内存数据库&#xff0c;对字符串操作&#xff08;如键、值的存储&#xff09;有极高的要求。c语言原生字符串&#xff08;以\0结尾的字符串数据&#xff09;有一些缺点&#xff1a;长度计算需要遍历&#xff08;O(n)时间…

STM32硬件I2C驱动OLED屏幕

本文基于STM32硬件I2C驱动SSD1306 OLED屏幕&#xff0c;提供完整的代码实现及关键注意事项&#xff0c;适用于128x32或128x64分辨率屏幕。代码通过模块化设计&#xff0c;支持显示字符、数字、汉字及位图&#xff0c;并优化了显存刷新机制。 零、完整代码 完整代码: 1&#x…

鸿蒙 PC 发布之后,想在技术上聊聊它的未来可能

最近鸿蒙 PC 刚发布完&#xff0c;但是发布会没公布太多技术细节&#xff0c;基本上一些细节都是通过自媒体渠道获取&#xff0c;首先可以确定的是&#xff0c;鸿蒙 PC 本身肯定是无法「直接」运行 win 原本的应用&#xff0c;但是可以支持手机上「原生鸿蒙」的应用&#xff0c…

【JAVA】抽象类与接口:设计模式中的应用对比(16)

核心知识点详细解释 Java抽象类和接口的定义、特点和使用场景 抽象类 抽象类是使用 abstract 关键字修饰的类。它不能被实例化&#xff0c;主要用于作为其他类的基类&#xff0c;提供一些通用的属性和方法。抽象类可以包含抽象方法和具体方法。抽象方法是使用 abstract 关键…

HTML 颜色全解析:从命名规则到 RGBA/HSL 值,附透明度设置与场景应用指南

一、HTML 颜色系统详解 HTML 中的颜色可以通过多种方式定义&#xff0c;包括颜色名称、RGB 值、十六进制值、HSL 值等&#xff0c;同时支持透明度调整。以下是详细分类及应用场景&#xff1a; 1. 颜色名称&#xff08;预定义关键字&#xff09; HTML 预定义了 140 个标准颜色名…

LVS负载均衡群集和keepalive

目录 一. 集群概述 1.1 集群的定义 1.2 集群的分类 1. 高可用集群 HA 2. 高性能运输群集 HPC 3.负载均衡群集 LB 4. 分布式存储集群 二. LVS概述 2.1 LVS的定义 2.2 LVS的工作原理 2.3 LVS 的三种工作模式 2.4 LVS 三种工作模式的对比 2.5 LVS 调度算法 1. 静态…

ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 展讯 T760 bl

ZTE 7551N 中兴小鲜60 远航60 努比亚小牛 解锁BL 刷机包 刷root 3款机型是一个型号&#xff0c;包通用&#xff0c; ro.product.system.modelZTE 7551N ro.product.system.nameCN_P720S15 #################################### # from generate-common-build-props # Th…

单片机-STM32部分:12、I2C

飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议&#xff0c;又称I2C协议&#xff0c;是由PHILP公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;IIC属于半双工同步通信方式。 IIC是一种同步…

Virtualized Table 虚拟化表格 el-table-v2 表头分组 多级表头的简单示例

注意添加这个属性,会影响到有多少个层级的表头: :header-height“[50, 40]”,即后面的columnIndex 如果有fix的列CustomizedHeader会被调用多次,如果有多个层级的表头,也会被调用多次, 实际被调用次数是(fix数 1 * 表头层级数量) 以下代码均删除了JSX TS版本代码 <templ…

防御保护-----第十二章:VPN概述

文章目录 第二部分&#xff0c;数据安全第十二章&#xff1a;VPN概述VPN概述VPN分类VPN关键技术隧道技术身份认证技术加解密技术数据认证技术 数据的安全传输密码学发展史 对称加密算法 --- 传统密码算法密钥解释流加密分组加密 --- 块加密算法填充算法PKCS7算法分组模式 公钥密…

前端项目打包部署流程j

1.打包前端项目(运行build这个文件) 2.打包完成后&#xff0c;控制台如下所示:(没有报错即代表成功) 3.左侧出现dist文件夹 4.准备好我们下载的nginx(可以到官网下载一个),然后在一个没有中文路径下的文件夹里面解压。 5.在继承终端内打开我们的项目&#xff0c;找到前面打包好…