尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

*题解:P6617 查找 Search

*题解:P6617 查找 Search
📅 发布时间:2026/6/20 3:30:10

原题链接

解析

考虑对于每个位置 \(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;
}

相关新闻

  • C 指针数组函数之间的关联
  • 逻辑回归(随笔)
  • 这封邮件写得真好,是你自己写的吗? 不,是AI写的

最新新闻

  • 博尔塔拉蒙古自治州黄金回收多少钱一克?本地实体门店回收价格对比整理 - 三大殿
  • 黄金铂金白银回收门店整理,各区均有分店联系方式 - 三大殿
  • 盘锦市闲置黄金变现多少钱?本地5家回收门店最新报价参考 - 千叶啊
  • CurseBreaker未来路线图:插件管理器的发展方向与规划
  • 2026安徽省铜陵市电大中专会计二建报考前置学历最新发布 - cc江江
  • 承德市黄金回收实体店怎么选?这份清单帮你货比三家 - 开始就结束

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号