当前位置: 首页 > news >正文

P5278 算术天才⑨与等差数列 题解

算术天才⑨与等差数列

题意

给定一个长度为 \(n\) 的序列 \(a\),接下来有 \(m\) 次操作:

  • 操作 \(1\):给定 \(x,y\),将 \(a_x\) 修改为 \(y\)
  • 操作 \(2\):给定 \(l,r,k\),询问将区间 \([l,r]\) 中的数从小到大排序后是否形成一个公差为 \(k\) 的等差数列。

强制在线\(x,y,l,r,k\) 均需要异或之前输出的 Yes 个数来解密。

数据范围

  • \(1\leqslant n,m \leqslant 3\times 10^5\)
  • \(0\leqslant a_i,y,k \leqslant 10^9\)

思路

似乎有一种随机化+维护若干次方然后哈希的做法,但据说可以被卡,所以不妨使用不需要随机化的线段树做法。

先假设不带修,来思考公差为 \(k\) 的等差数列怎么判。

首先 \(k=0\) 是简单的,维护一下区间 max, min 即可,而当 \(k\ne 0\) 时,\([l,r]\) 要形成等差数列则具有以下充要条件:

  • \(\max\limits_{l\leqslant i \leqslant r} \{a_i\}-\min\limits_{l\leqslant i \leqslant r} \{a_i\}=(r-l)\times k\)
  • 区间内每个数互不相等。
  • 对于 \(l < i \leqslant r\),有 \(|a_i-a_{i-1}| \equiv 0 \pmod{k}\)

条件 \(1\) 仍旧是区间 max, min;对于条件 \(2\),考虑记录每个数的上一次出现位置 \(lst_i\),若 \(\max\limits_{l\leqslant i \leqslant r}\{ lst_i\}<l\),即每个数上次出现都不在区间内,也就是互不相等;条件 \(3\) 则是可以转化为 \(\gcd\limits_{l<i\leqslant r} \{|a_i-a_{i-1}|\}\equiv 0 \pmod{k}\),依然可以轻松判断,这些东西预处理一下即可。

接下来考虑带修如何做,不难发现上面的三个条件都可以丢到线段树上去维护,也就是线段树记录区间 max, min, max lst, gcd 和最左最右端的数方便维护差值。然后就是单点修改。

首先 max, min 和左右端的数都是直接的,那么就是看 lst 该如何维护。

由于值域 \(V\) 较大且强制在线,所以肯定要上 STL 了,考虑使用 map 套 set 来记录每个数的出现位置,那么修改 \(x\) 可能影响到 lst 的位置就是去 map[a[x]] 中找后继、map[y] 中找后继以及 \(x\) 本身了,用三次单点修改来维护即可,本题结束。

复杂度

  • 时间:\(O((n+m)\log n)\),由于多次单修和 STL,常数不小。
  • 空间:\(O(n)\)

Code

点击查看代码
#include <iostream>
#include <set>
#include <map>
#define _1 (__int128)1using namespace std;
using ll = long long;
using pii = pair<int, int>;void FileIO (const string s) {freopen((s + ".in").c_str(), "r", stdin);freopen((s + ".out").c_str(), "w", stdout);
}const int N = 3e5 + 10, INF = 1e9 + 10;struct SegTree {int mx, mi, lst, g, pre, suf;
} tr[N * 4], ret;int n, m, a[N], ans;
map<int, set<int>> mp;int Prev (int id) {auto it = mp[a[id]].lower_bound(id);if (it == mp[a[id]].begin()) return 0;else return *prev(it);
}int gcd (int x, int y) {if (!x || !y) return x + y;while (x ^= y ^= x ^= y %= x) {}return y;
}SegTree Merge (SegTree i, SegTree j) {if (i.mi == INF) return j;if (j.mi == INF) return i;return {max(i.mx, j.mx), min(i.mi, j.mi), max(i.lst, j.lst), gcd(gcd(i.g, j.g), abs(j.pre - i.suf)), i.pre, j.suf};
}void pushup (int id) {tr[id] = Merge(tr[id * 2], tr[id * 2 + 1]);
}void build (int id, int l, int r) {if (l == r) {tr[id] = {a[l], a[l], Prev(l), 0, a[l], a[l]};return ;}int mid = (l + r) >> 1;build(id * 2, l, mid), build(id * 2 + 1, mid + 1, r);pushup(id);
}void modify (int id, int l, int r, int x) {if (l == r) {tr[id] = {a[l], a[l], Prev(l), 0, a[l], a[l]};return ;}int mid = (l + r) >> 1;if (mid >= x) modify(id * 2, l, mid, x);else modify(id * 2 + 1, mid + 1, r, x);pushup(id);
}void Query (int id, int l, int r, int x, int y) {if (l >= x && r <= y) {ret = Merge(ret, tr[id]);return ;} else if (l > y || r < x) return ;int mid = (l + r) >> 1;Query(id * 2, l, mid, x, y), Query(id * 2 + 1, mid + 1, r, x, y);
}signed main () {ios::sync_with_stdio(0), cin.tie(0);// FileIO("");cin >> n >> m;for (int i = 1; i <= n; i++) cin >> a[i], mp[a[i]].insert(i);build(1, 1, n);for (int i = 1, op, x, y, k; i <= m; i++) {cin >> op >> x >> y, x ^= ans, y ^= ans;if (op == 1) {auto it = mp[a[x]].upper_bound(x);mp[a[x]].erase(x), a[x] = y;if (it != mp[a[x]].end()) modify(1, 1, n, *it);mp[a[x]].insert(x), it = mp[a[x]].upper_bound(x);if (it != mp[a[x]].end()) modify(1, 1, n, *it);modify(1, 1, n, x);} else {cin >> k, k ^= ans;if (x > y) swap(x, y);ret = {0, INF, 0, 0, 0, 0}, Query(1, 1, n, x, y);if (!k) {if (ret.mx == ret.mi) ans++, cout << "Yes\n";else cout << "No\n";} else {if (ret.mx - ret.mi != 1ll * (y - x) * k || ret.lst >= x || ret.g % k) {cout << "No\n";continue;}cout << "Yes\n";ans++;}}}return 0;
}
http://www.jsqmd.com/news/1302380/

相关文章:

  • OpCore-Simplify:终极黑苹果EFI生成器,15分钟完成专业配置的图形化工具
  • LangGraph工作流踩坑记:权限日志没配好,Agent上线直接崩
  • LoRA训练实战9:Wan2.2人物角色LoRA极简训练法,上手指南!
  • 数据流动安全监测平台泛在监测与全链路防护技术研究
  • 年采购额5000万企业,我劝你一定要选这几款采购供应链系统
  • 河南适合叛逆孩子就读的文武学校有哪些?2026 正规武校清单,地址与报名渠道整理完毕【招生热线】 - 全国文武学校招生
  • OpenAI Codex Security最佳实践:避免常见安全漏洞的10条准则
  • 吃透回收基础常识 普通人在杭州出手黄金再也不必迷茫 - 日常比对手册
  • 指挥中心控制台厂家选购隐藏秘密,你究竟知道多少?
  • 如何用BiliDownloader轻松下载B站视频?终极免费工具使用指南
  • 4款降AI工具iThenticate实测:期刊投稿场景哪款通过率最高?
  • 3大突破性解决方案:Bebas Neue如何让免费字体实现专业设计效果
  • 北京博亚信诚科技适合注册小微企业吗 - 17728098551
  • 通达信起爆点量化交易策略解析与实现
  • 论文AI率多少不用改?2026年AIGC检测率安全线自测指南
  • Windows安卓应用安装终极指南:3分钟搞定APK安装,告别笨重模拟器
  • Qwik-UI vs 其他组件库:为什么它能让你的应用性能提升300%
  • 2026年为什么AIGC检测标准更严了?各院校最新要求汇总
  • 终极分屏游戏指南:Nucleus Co-Op如何让单机游戏变身多人派对
  • 大模型如何学会“拆任务”?自主规划Agent的技术跃迁路径
  • 【AI建造师备考黄金公式】:20年命题专家亲授,3步搞定知识图谱+5大高频考点预测(限免72小时)
  • 多 Agent 协作时权限、安全和审计怎么做?
  • 7.31java学习记录和生活随笔
  • 市面上知名的南宁旧房改造团队团队口碑
  • 数据分析结果质量优劣如何分辨
  • 中国城市地标手绘全景图鉴
  • SpringBoot+Vue校园外卖系统架构设计与实现
  • 华南半导体封装设备产业带崛起:真空共晶炉与回流焊技术布局加速
  • 长尾流量怎么挖 | 老网站做内容重组的挖掘技巧
  • 小A问答 | C盘又双叒叕红了?查收这份分级清理指南,专治各种不敢删