P2757 [国家集训队] 等差子序列 题解

news/2025/11/3 22:02:33/文章来源:https://www.cnblogs.com/Tsuukaku/p/19188417

Link

好题。考虑简化题意:找一个 \(|p| \geq 3\) 的序列 \(p\) 使得 \(A_{p_i}\) 呈现等差数列,那我们找一个三个数的等差数列就可以了。中间值是特殊的,我们枚举中间值,判断左右两边是否存在一个公差相等的等差数列项。

用到一个有用的 \(01\) 序列转换 Trick。我们从左到右遍历 \(A\),同时维护出一个 \(01\)\(b\),每次扫描到 \(A_i\) 就将 \(b\) 中对应的 \(i\) 位设置成 \(1\)。考虑一组等差数列存在且公差为 \(k\),这意味着 \(A_i - k, A_i + k \in [1, n]\) 同时前一项出现了,后一项尚未出现,即 \(b_{A_i - k} = 1\)\(b_{A_i + k} = 0\),此时 \(A_i - k, A_i, A_i + k\) 顺序排列形成公差为 \(k\) 的长度为 \(3\) 的等差数列。

现在的问题是怎么维护或者说高效判断出有存在于左右两边的符合公差要求的项。我们再次转化问题为检查 \(b\) 是否关于 \(A_i\) 呈现中心对称。如果以 \(A_i\) 为中心的对称区间不是回文,则存在某个 \(k\) 使得 \(A_i - k\)\(A_i + k\) 一个在左一个在右,反之如果是回文的,意味着对于每个 \(k\)\(A_i - k, A_i + k\) 要么都出现要么都不出现。

现在新的问题是如何快速判断回文串?常规的,使用字符串哈希。维护一棵线段树支持带修查询的字符串哈希值,对于 \(A_i\),我们计算正序哈希 \(H_{[A_i - k, A_i - 1]}\) 和逆序哈希 \(H'_{[A_i + 1, A_i + k]}\),如果 \(H = H'\) 则存在回文。实现上,注意逆序哈希的线段树合并顺序。

#include <bits/stdc++.h>using i64 = long long;
using u64 = unsigned long long;constexpr int N = 6e5 + 7;
constexpr u64 B = 13331;int n;
int a[N];
u64 b[N];struct SegTree {struct node {int l, r;u64 v1, v2;} tr[N << 2];#define ls(o) (o << 1)#define rs(o) (o << 1 | 1)void pushup(const int o) {int len_r = tr[rs(o)].r - tr[rs(o)].l + 1;int len_l = tr[ls(o)].r - tr[ls(o)].l + 1;tr[o].v1 = tr[ls(o)].v1 * b[len_r] + tr[rs(o)].v1;tr[o].v2 = tr[rs(o)].v2 * b[len_l] + tr[ls(o)].v2;}void build(int o, int l, int r) {tr[o].l = l, tr[o].r = r; tr[o].v1 = tr[o].v2 = 0;if (l == r) {return;}int mid = (l + r) >> 1;build(ls(o), l, mid);build(rs(o), mid + 1, r);}void update(int o, int l, int r, int p) {if (l == r) {tr[o].v1 = tr[o].v2 = 1;return;}int mid = (l + r) >> 1;if (p <= mid)update(ls(o), l, mid, p);elseupdate(rs(o), mid + 1, r, p);pushup(o);}u64 query1(int o, int l, int r, int ql, int qr) {if (ql <= l && r <= qr) {return tr[o].v1 * b[qr - r];}int mid = (l + r) >> 1;u64 res = 0;if (ql <= mid)res += query1(ls(o), l, mid, ql, qr);if (qr > mid)res += query1(rs(o), mid + 1, r, ql, qr);return res;}u64 query2(int o, int l, int r, int ql, int qr) {if (ql <= l && r <= qr) {return tr[o].v2 * b[l - ql];}int mid = (l + r) >> 1;u64 res = 0;if (qr > mid)res += query2(rs(o), mid + 1, r, ql, qr);if (ql <= mid)res += query2(ls(o), l, mid, ql, qr);return res;}
} seg;void init() {b[0] = 1;for (int i = 1; i < N; i++) {b[i] = b[i - 1] * B;}
}void solve() {std::cin >> n;for (int i = 1; i <= n; i++) {std::cin >> a[i];}seg.build(1, 1, n);for (int i = 1; i <= n; i++) {int t = a[i]; int len = std::min(t - 1, n - t);if (len > 0) {u64 h1 = seg.query1(1, 1, n, t - len, t - 1);u64 h2 = seg.query2(1, 1, n, t + 1, t + len);if (h1 != h2) {std::cout << "Y\n";return;}}seg.update(1, 1, n, t);}std::cout << "N\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;init();while (t--) {solve();}return 0;
}

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

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

相关文章

拾壹月Ⅲ

摆了一天,非常困,啥也没写,大部分不是口胡就是看题解。 打球 MX noip Round1 T1 很快就会了,没修改的时候最优的肯定是最大值加上最小的,直接排序求最大最小值即可。 而对于修改 \(a_x=v\) ,不妨设修改是变小的:…

20251103周一日记

20251103周一日记这周任务好多啊:哥哥结婚 两个课汇报 高数课答疑 实验助教 科研的 今日: 1.早上一觉醒来胸口疼,好像是压到了。洗个澡吃完饭回学校。 2.下午回实验室网很卡,把上周张老师发的毕设文章读完了。开始…

Window 安装多个 MySQL 实例 - Higurashi

当前已经安装了 MySQ(8.3.0),因为有时会需要用到多套系统数据(比如测试生产各一套数据),为了避免数据库名称冲突,希望安装多个 MySQL 实例。停止现有 MySQL 复制D:\soft\mysql-8.3.0-winx64\my.ini到D:\soft\my…

普赛斯

普赛斯关于我们-武汉普赛斯电子|全球光电芯片测试方案领跑者

claude code+openspec开发java代码基本流程

0️⃣ 准备:一次装好,终身可用 # 1. 装 Node ≥20 node -v # 出现 v22+ 就行# 2. 装 OpenSpec(规范驱动) npm i -g @fission-ai/openspec@latest# 3. 装 Claude Code(AI 编码) npm i -g cl…

【C】结构体赋值

结构体赋值 例如: #include <stdio.h> #include <string.h>struct Inner {int x;char name[20]; };struct Outer {int id;struct Inner inner; }; 初始化赋值(定义时): struct Outer o1 = {.id = 1,.i…

Office 2024 专业增强版下载安装教程:安装/下载/激活/全流程教程

大家好!最近总有朋友问 “Office 2024 专业增强版怎么装”“在哪能下安全的 Office 2024 安装包”,今天特意整理这份超详细的 Office 2024 专业增强版下载安装教程,从电脑能不能装的配置要求,到安全下载 Office 20…

Office 2024 专业增强版下载安装教程:安装/下载/激活/全流程教程

大家好!最近总有朋友问 “Office 2024 专业增强版怎么装”“在哪能下安全的 Office 2024 安装包”,今天特意整理这份超详细的 Office 2024 专业增强版下载安装教程,从电脑能不能装的配置要求,到安全下载 Office 20…

模拟赛 29

T1模拟即可,请输入文本。点击查看代码 #include<bits/stdc++.h> #define MAXN 10005 #define int long long using namespace std; const int inf=1e18; string tmp,ans[20]; int T,n,cnt,pos; char c[1005]; s…

11.3阅读笔记

​​1. 变化是必然的:拥抱“柔性”设计​​ “柔性设计”不是指设计能预测所有变化,而是指当变化来临时,​​修改所造成的连锁反应被降到最低​​。这直接回到了我们10月份讨论的​​正交性​​和​​DRY原则​​。…

fhq treap笔记

fhq(范浩强) treap 基本的操作就是split以及merge 需要pushup来维护siz属性的正确性 split分为按val以及按rank 用kth来得到第k个数的值 反过来,如果是一个排列的话,可以用维护出来的每个节点的fa以及pos来得到排名…

K8S最全详解 - 智慧园区

K8S K8S,全程是“Kubernetes”,是一个开源的容器编排平台,用于自动化应用的 部署、扩展和管理。 K8S,最早由 Google 开发,后捐赠给 CNCF,如今已经成为 云原生领域的事实标准。 K8S 解决了在生产环境中管理大量容…

11/3

今天下午Java考试,惊险度过

ICPC2025 武汉站 游记

rk11-北京大学-请输入文本 Pre 贵校的竞争还是太激烈了,在前两次选拔赛打炸的情况下最后一场极限翻盘,苟到了一个 ICPC 区域赛名额。 参加的网络赛 2 因为某个队友睡过头了所以只有两个人,打的也一坨,喜提 #161。 …

25.11.03

AGC003E 哎我好菜怎么这个题卡半天。 首先想到可以把 \(a_i\) 单调栈干掉,然后倒着扫求出前面要重复多少次。 但是会剩下一段,需要单独做。 先不要想太复杂,考虑如何暴力,因为额外部分只关心长度和次数,因此设计一…

win10安装neo4j-community-3.5.7-windows

win10安装neo4j-community-3.5.7-windows 1、下载neo4j-community-3.5.7-windows下载地址:https://we-yun.com/doc/neo4j/选择对应版本的文件,下载, 2、配置环境变量NEO4J_HOME D:\neo4j-community-3.5.7 Path:%NE…

工作感受月记(202511月)

2025年11月03号 月初工作第一天,也是第一周,遇事较多,全是请假半天做。 周一见同学,请假一下午,周二去上海,欢送老板会。周三回成都,约见唐老师。周六需考试,软件设计师。 今日工作事项: 1/ 与yuki进行app se…

基于Blocking queue的生产消费模型

file: BlockQueue.hpp: #pragma once #include<pthread.h> #include<cassert> #include<queue> const int maxsize=5; template<class T> class BlockQueue{ public:BlockQueue(){int n;n=pth…

React中useContext的基本使用和原理解析

React 中 useContext 的使用方法 在 React 中,useContext 是一个内置的 Hook,用于在函数组件中轻松访问 Context(全局公共状态),避免了手动逐层传递 props 的复杂性。它依赖于 Context API,通过 Provider 提供数…

JDK的安装过程

第一步:右击“此电脑”,在显示的菜单中单击“属性”,在“系统信息”中点击“高级系统设置” 第二步:在弹出的“系统属性”对话框中,选择“高级”选项卡中的“环境变量” 第三步:在弹出的对话框中,单击“系统变量…