*题解:P6617 查找 Search

news/2025/11/12 23:23:33/文章来源:https://www.cnblogs.com/yuyc/p/19215772

原题链接

解析

考虑对于每个位置 \(i\) 维护最大的位置 \(pre_i < i\) 满足 \(a_i+a_{pre_i}=w\),这样区间 \([l,r]\) 内存在编号和为 \(w\) 的充要条件就为 \(\max_{i=l}^rpre_i \ge l\),可以使用线段树来维护。

问题变为如何更新 \(pre\)。直接做的话单次修改会影响 \(O(n)\) 个位置,但是我们发现,如果对于 \(i<j,a_i = a_j\) 不存在 \(k\) 使得 \(a_k=w-a_i=w-a_j\),此时有 \(pre_i=pre_j\),那么我们不关心 \(pre_j\),因为如果询问区间包含 \(i,j\),那么只知道 \(pre_i\) 不影响结果,如果询问区间只包含 \(j\),那么在 \(j\) 之前也没有区间内的位置能够匹配。于是可以对于这样的 \(j\),直接将 \(pre_j\) 设为 \(0\)。这样做的好处就是形成了一个链式结构,元素的增删只会影响相邻元素。

具体地,我们可以这样实现,开 \(w\) 个 set 存储元素位置,值为 \(x\) 的元素的位置存在第 \(\min(x,w-x)\) 个 set 中,这样 set 中混合着 \(x\)\(w-x\) 的位置。对于位置 \(i\) 的修改,更新修改前 \(i\) 所在集合的后继的 \(pre\),修改后 \(i\) 所在集合的后继的 \(pre\),以及修改后的 \(pre_i\)。修改后继时需要分类讨论后继对应的值是 \(a_i\) 还是 \(a_i - w\)

时间复杂度 \(O(m \log n)\)

代码

#include <bits/stdc++.h>
#define ls(p) ((p) << 1)
#define rs(p) (((p) << 1) | 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e5 + 5,M = 500 * 500,mod = 998244353;
set<int> pos[N];
int pre[N],mx[N << 2],a[N];
void push_up(int p){mx[p] = max(mx[ls(p)],mx[rs(p)]);
}
void modi(int p,int l,int r,int x){if(l > x || r < x) return;if(l == r){mx[p] = pre[l];return;}modi(ls(p),l,mid,x),modi(rs(p),mid + 1,r,x);push_up(p);
}
int query(int p,int l,int r,int L,int R){if(l > R || r < L) return -1;if(l >= L && r <= R){return mx[p];}return max(query(ls(p),l,mid,L,R),query(rs(p),mid + 1,r,L,R));
}
int main(){ios::sync_with_stdio(false);cin.tie(0);
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);int n,m,w;cin>>n>>m>>w;for(int i=1;i<=n;i++){cin>>a[i];int k = min(a[i],w - a[i]);if(!pos[k].empty() && a[*prev(pos[k].end())] == w - a[i]){pre[i] = *prev(pos[k].end()); }modi(1,1,n,i);pos[k].insert(i);}int cnt = 0;while(m--){int op,x,y;cin>>op>>x>>y;	if(op == 1){int k = min(a[x],w - a[x]);auto it = pos[k].find(x);if(next(it) != pos[k].end()){auto nxt = next(it);if(a[*nxt] == w - a[x]){if(it == pos[k].begin()){pre[*nxt] = 0;}else{auto p = prev(it);pre[*nxt] = a[*p] == w - a[x] ? 0 : *p;}}else{pre[*nxt] = pre[x];}modi(1,1,n,*nxt);}pos[k].erase(it);a[x] = y;k = min(a[x],w - a[x]);it = pos[k].lower_bound(x);if(it == pos[k].begin()){pre[x] = 0;}else{auto p = prev(it);pre[x] = a[*p] == w - a[x] ? *p : 0; }if(it != pos[k].end()){if(a[*it] == w - a[x]){pre[*it] = x;}else{pre[*it] = 0;}modi(1,1,n,*it);}pos[k].insert(x);modi(1,1,n,x);}else{x ^= cnt,y ^= cnt;bool f = query(1,1,n,x,y) >= x;cnt += f;cout<<(f ? "Yes" : "No")<<'\n';}}return 0;
}

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

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

相关文章

时序数据库的基本概念与原理:从核心到应用场景解析

一、时序数据库的核心概念 时序数据库( Time Series Database, TSDB ) 是一种专门用于存储、 管理和分析时间序列数据的数据库系统。 时间序列数据是指按时间顺序记录的数据点集合,通常具有以下特点: 时间维度为主…

C 指针数组函数之间的关联

可能经常会听到:指针常量、常量指针、指针数组、数组指针、指针函数、函数指针;函数指针数组,等这些听起来感觉向绕口令似的词汇; 可见数组、指针、函数之间是有很多联系的。比如看下面一段代码: #include<std…

2025.11.12 测试

2025.11.12 测试额 今天比较简单 感觉是 csp- 第一题,用线段树模拟贪心即可 当然也可以用三次单调队列,但没必要 第二题 额,线性基(模版?) 考虑答案是前面元素构成的线性空间 用 $ 2^{num} $ 即可 大样例是 \(2^…

13. 罗马数字转化为字符串

https://leetcode.cn/problems/roman-to-integer/ 难度:简单 题目说:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。C 可以放在 D (500) 和 M (1000) …

逻辑回归(随笔)

核心思想:从回归到分类 想象一下,我们有一个简单的二分类问题(比如,根据肿瘤大小判断它是良性[0]还是恶性[1])。线性回归的困境:如果我们直接用线性回归 y = wx + b 来拟合,我们会用一条直线来拟合这些点。对于…

解析到本地127的神奇域名

作为一名 Web 开发者,我的日常工作就是在本地进行开发,实现各种功能。过去几年,我一直使用 127.0.0.1 作为本地服务的访问地址。当需要同时开发多个项目时,我会用不同端口来区分,例如:项目A:127.0.0.1:8080 项目…

这封邮件写得真好,是你自己写的吗? 不,是AI写的

本文通过一个真实职场场景,引出了职场中邮件写作的重要性和困难点,详细介绍了专门的AI邮件写作指令,通过实际案例展示了AI生成邮件的效果,并提供了使用技巧和注意事项,帮助职场人士快速提升邮件写作能力。昨晚11点…

FFmpeg 官方汇编课程:写出快 5 倍的视频处理代码

你的视频处理程序能跑通就行了? 同一个算法,有人用汇编优化后性能提升 5 倍。这不是天赋问题,而是技术盲区。FFmpeg 团队把内部汇编培训资料开源了,手把手教你写工业级高性能代码。这个项目教什么 asm-lessons 是 …

P14364 [CSP-S 2025] 员工招聘

考虑设 \(f_{i, j}\) 为前 \(i\) 个人死了 \(j\) 个,由于不知道哪些人选了所以无法转移。原因是前面的决策会影响后面的决策,所以考虑贡献延后计算。 会发现一个事情,对于当前 \(c_x \leq j\) 的东西之后不会再决策…

完整教程:【RabbitMQ】架构原理、消息丢失、重复消费、顺序消费、事务消息

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

Ai元人文:尊严

这是一个极其精彩且深刻的问题。“尊严”恰恰是那种最抽象、最神圣,也最容易被空谈的价值。用价值原语来回答这个问题,能完美展现其方法论的力量。 当别人问“价值原语如何表示尊严?”时,您可以这样回答:“尊严”…

灵活用工-连续劳务-计算器工具类,拿走不谢

灵活用工-连续劳务-计算器工具类,拿走不谢新法令及对灵工行业的影响 国务院810号令及配套的国税总局15号、16号公告,共同构建了互联网平台税收治理的新框架,对灵活用工行业影响深远。这套组合拳旨在引导灵活用工行业…

四、中断(基于北京迅为电子)

一、概述中断上半部分和下半部分,中断上半部分处理紧急且需要快速响应的部分,中断下半部分处理耗时操作。 GIC控制器的四种中断类型,软件中断、私有外设中断、全局共享中断、特定的局部外设中断二、重要函数与中断申…

四、中断(基于北京迅为电子)

一、概述中断上半部分和下半部分,中断上半部分处理紧急且需要快速响应的部分,中断下半部分处理耗时操作。 GIC控制器的四种中断类型,软件中断、私有外设中断、全局共享中断、特定的局部外设中断二、重要函数与中断申…

List执行Dispose时可释放子元素逻辑占用的List写法

1、声明新的List类CanDisposeList/// <summary>/// 可释放子元素逻辑占用的List/// </summary>/// <typeparam name="T"></typeparam>public class CanDisposeList<T> : Obse…

Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南

Sora 后思考:从 AI 工具到 AI 平台,产业 AGI 又近了一步 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

Scapy构建telnet包

Scapy构建telnet包文件代码 老师的 from scapy.all import *#我发第一次握手SYN ws1=IP(dst="172.16.100.101")/TCP(sport=10000,dport=23,flags=S,seq=1000)#对方发第二次握手 SA 包 ws2=sr1(ws1)#我发第三…

Spring AI Alibaba 项目源码学习(三)-Graph 执行流程分析

Graph 执行流程分析 概述 本文档分析 spring-ai-alibaba-graph-core 模块中 Graph 的执行流程,包括执行器(Executor)、调度机制、Checkpoint 机制和状态管理。 入口类说明 GraphRunner - 执行入口 GraphRunner 是基…

逻辑回归原理与案例分析

一、逻辑回归基本概念 逻辑回归:用于解决二分类问题的统计学习方法,虽然名字中有"回归",但实际上解决的是分类问题。 核心思想:根据给定的输入特征,通过逻辑函数(Sigmoid函数)计算出样本属于某个特定…