线段树专题-等差子序列 BZOJ-2124

线段树专题-等差子序列

感谢

感谢孙耀峰的线段树PPT,使我获益匪浅.

题目来源

BZOJ−2124BZOJ-2124BZOJ2124

题意

给出长度为nnn1−n1-n1n的排列AAA
问是否存在一组1≤p1≤p2≤...≤pl≤n,l≥31 \le p_1 \le p_2 \le ... \le p_l \le n,l \ge 31p1p2...pln,l3
使得Ap1,Ap2,...,AplA_{p1},A_{p2},...,A_{pl}Ap1,Ap2,...,Apl构成等差序列
数据范围n≤104n \le 10^4n104

题解

只要能形成长度为333的等差子序列,就直接输出YesYesYes即可.

即需要寻找i,j,ki,j,ki,j,k满足Ai=Aj−t,Ak=Aj+t,且t>0.A_i = A_j - t,A_k = A_j + t,且t > 0.Ai=Ajt,Ak=Aj+t,t>0.

根据转化后的式子,我们只需要枚举jjj,判断是否存在这样的ttt即可.

考虑到AAA是一个排列,排列中的数两两不同,因此我们可以考虑开一个数据结构维护一下内容:

当枚举到AjA_jAj的时候,我可以很快的查询任何一个AiA_iAiAjA_jAj的左边还是右边,(记如果i&lt;ji&lt;ji<jAjA_jAj应该标记为000表示在左边,若i&gt;ji&gt;ji>jAjA_jAj应该标记为111表示在右边).

这样的话,如果010101[Aj−t,Aj−1][A_j-t,A_j-1][Ajt,Aj1][Aj+1,Aj+t][A_j+1,A_j+t][Aj+1,Aj+t]之间有一位不相同(也就是说存在关于AjA_jAj的对称位置的两个数在AjA_jAj两侧,说明可以形成等差子序列).

因此只有当以上两个01串,翻转过来完全相同的情况下,才不存在以AjA_jAj作为中心的等差序列.

如何判断010101串相同呢?答案是哈希.

建立一颗线段树,维护的是010101串的正向和反向哈希值.

从小到大枚举Aj,[1,n]A_j,[1,n]Aj,[1,n],然后更新线段树,并判断是否有以AjA_jAj为对称中心的等差序列.

代码

#include <iostream>
#include <cstring>
const int N = 10007;
typedef unsigned long long ull;
int T,n;
int a[N];ull pow[N];
struct work{ull hash0,hash1;int len;
};#define pr(x) std::cout << #x << ": " << x << std::endl
struct segtree{ull hashs[N * 4][2];void maintain(int rt,int l,int r) {int mid = (l + r) / 2;hashs[rt][0] = hashs[rt*2][0] + hashs[rt*2+1][0] * pow[mid - l + 1];hashs[rt][1] = hashs[rt*2+1][1] + hashs[rt*2][1] * pow[r - mid];}void change(int rt,int l,int r,int pos,int val) {if(l == r) {hashs[rt][0] = hashs[rt][1] = val;return ;}   int mid = (l + r) / 2;if(pos > mid) change(rt*2+1,mid+1,r,pos,val);elsechange(rt*2,l,mid,pos,val);maintain(rt,l,r);}work query(int rt,int l,int r,int ql,int qr) {if(r < ql || qr < l) {return (work){0,0,0};} else if(ql <= l && r <= qr) {return (work){hashs[rt][0],hashs[rt][1],r - l + 1};}int mid = (l + r) / 2;work wa = query(rt*2,l,mid,ql,qr);work wb = query(rt*2+1,mid+1,r,ql,qr);return (work){wa.hash0 + wb.hash0 * pow[wa.len],wb.hash1 + wa.hash1 * pow[wb.len],wa.len + wb.len};}}seg;int main()
{pow[0] = 1;for(int i = 1;i < N;++i) pow[i] = 3 * pow[i-1];std::ios::sync_with_stdio(false);std::cin >> T;while(T--) {int f = 0;memset(&seg,0,sizeof(seg));std::cin >> n;for(int i = 1;i <= n;++i) {std::cin >> a[i];seg.change(1,1,n,a[i],1);if(a[i] == 1 || a[i] == n) continue;int len = std::min(a[i]-1,n - a[i]);work wa = seg.query(1,1,n,a[i]-len,a[i]-1);work wb = seg.query(1,1,n,a[i]+1,a[i]+len);if(wa.hash0 != wb.hash1) {f = 1;}}if(!f) std::cout << "N" << std::endl;elsestd::cout << "Y" << std::endl;}return 0;
}

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

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

相关文章

【模拟】小游戏

小游戏 题目大意&#xff1a; 有n个数形成一个环&#xff0c;从第S个开始&#xff0c;先往后数N个数然后把这个数取出来&#xff0c;再往前数K个数把这个数取出来&#xff0c;问取的数字依次是什么 原题&#xff1a; 题目描述 【题目背景】 yk同学是一个灰常灰常有爱的同…

P4051-[JSOI2007]字符加密【SA】

正题 题目链接:https://www.luogu.com.cn/problem/P4051 题目大意 给一个字符串&#xff0c;求它当每个环状字符串&#xff08;比如ABCABCABC的就是ABC,CAB,BCAABC,CAB,BCAABC,CAB,BCA&#xff09;排序后所有串的末尾连起来当字符串。 解题思路 这个其实就是每个串的后缀加上…

DevOps 实践:千里之行

在上一篇 DevOps 渊源&#xff1a;角色消融 中我们分析了在作坊式团队中的责任重叠&#xff0c;也回顾了 DBA 角色的消融。那么&#xff0c;如今我们讲的 DevOps 又是什么角色的消融呢&#xff1f; 我想你已经猜到了&#xff0c;接下来要消融的角色就是运维人员了。那这次又是什…

线段树专题-黑白棋盘 BZOJ-1453

线段树专题-黑白棋盘 题目来源 BZOJ−1453BZOJ-1453BZOJ−1453 题意 QQQ次操作每次操作给出(x,y)(x,y)(x,y),将(x,y)(x,y)(x,y)个格子颜色取反每次操作后,输出棋盘上黑白联通块的个数n≤100,Q≤104n \le 100,Q \le 10^4n≤100,Q≤104 题解 显然不能直接套并查集,因为直接套…

约数个数

约数个数 题目大意&#xff1a; 求a到b之间每个数的约数的个数之和 原题&#xff1a; 题目描述 定义f(x)为x的约数个数&#xff0c;x为正整数。 f(a)f(a1)……f(b)&#xff0c;即a,b之间每个数的约数的总和。 输入 一行两个正整数a、b&#xff0c;以一个空格隔开。 输出…

P2257-YY的GCD【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P2257 题目大意 给出n,mn,mn,m&#xff0c;求∑i1n∑j1m[gcd(i,j)∈p]\sum_{i1}^n\sum_{j1}^m[gcd(i,j)\in p]i1∑n​j1∑m​[gcd(i,j)∈p] 定义ppp是质数集 解题思路 首先考虑定义f(x)∑i1n∑j1m[gcd(i,j)x]f(x)\sum_{i1}…

asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...

最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ &#xff01;因此学习了一下这个开源框架&#xff01;下面对Exceptionless的学习做下笔记&#xff01;Exceptionless是什么&#xff1f;能做什么呢&#xff1f;“Exceptionless”这…

【dfs】【树】机器选择

机器选择 题目大意&#xff1a; 有一个树状的图&#xff0c;要求安一个点&#xff0c;使这个点到最远的点的距离最小 原题&#xff1a; 题目描述 自从省队NOI赛前集训在scz举行之后&#xff0c;一个名叫cs1.6.exe的文件开始在机房广泛使用起来。每天大家都要找神犇小X借移…

ACM-ICPC中博弈论的一些小小总结

博弈论 参考 [1]https://blog.csdn.net/clover_hxy/article/details/53818624 [2]https://blog.csdn.net/foreyes_1001/article/details/82862324 [3]https://www.cnblogs.com/lxm940130740/p/3268803.html 一.尼姆博弈 问题提出 下面给出Nim游戏的三种变体 现有nnn堆石子,每…

P3312-[SDOI2014]数表【莫比乌斯反演,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P3312 题目大意 定义F(x)F(x)F(x)表示xxx的约数和 给出n,m,an,m,an,m,a&#xff0c;求∑i1n∑j1m[F(gcd(i,j))≤a]∗F(gcd(i,j))\sum_{i1}^n\sum_{j1}^m[F(gcd(i,j))\leq a]*F(gcd(i,j))i1∑n​j1∑m​[F(gcd(i,j))≤a]∗F(g…

使用 IIS 在 Windows 上托管 ASP.NET Core2.0

准备&#xff1a;操作系统&#xff1a;Windows Server 2008 R2 或更高版本开发环境&#xff1a;VS2017回到顶部第一步&#xff1a;新建项目ASP.NET Core Web应用程序在 Visual Studio 中&#xff0c;选择“文件”>“新建”>“项目”。在新建项目对话框的左侧窗格选择“.N…

数学推导题,NTT,快速数论变换,Wannafly-导数卷积

导数卷积 题目描述 题解 参考了一下标程的推导过程,因为这个推导对我这种数学弱渣真的有点难鸭. [1]f(x)f(x)f(x)的iii次导函数: f(i)(x)ai∗i!0!ai1∗(i1)!1!∗x1...an−1∗(n−1)!(n−1−i)!∗xn−1−if^{(i)}(x) a_{i}*\frac{i!}{0!} a_{i1}*\frac{(i1)!}{1!}*x^{1} ...…

初一级练习题(2019.3.8)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky250250250100100100100100100505050000222lyflyflyf240240240100100100505050505050404040333wjjwjjwjj210210210909090707070505050000555lthlthlth12012012020202050505050505…

使用 C# 代码实现拓扑排序

0.参考资料尊重他人的劳动成果&#xff0c;贴上参考的资料地址&#xff0c;本文仅作学习记录之用。https://www.codeproject.com/Articles/869059/Topological-sorting-in-Csharphttps://songlee24.github.io/2015/05/07/topological-sorting/https://www.cnblogs.com/skywang1…

P3327-[SDOI2015]约数个数和【莫比乌斯反演】

正题 题目链接:https://www.luogu.com.cn/problem/P3327 题目大意 TTT组询问给出n,mn,mn,m&#xff0c;d(x)d(x)d(x)表示xxx的约数个数&#xff0c;求∑i1n∑j1md(i∗j)\sum_{i1}^n\sum_{j1}^md(i*j)i1∑n​j1∑m​d(i∗j) 解题思路 对于iii和jjj的两个约数a,ba,ba,b如果他们…

数学推导题,NTT,快速数论变换,Wannafly-乒乓球

乒乓球 题目描述 小 BoBoBo 是某省乒乓球名列前茅的选手&#xff0c;现在他有 nnn 颗乒乓球一字排开&#xff0c;第iii颗乒乓球的权值为 wiw_iwi​ 每次他会随机从现有的乒乓球中等概率选一颗拿走&#xff0c;然后得到的收益是这颗球左边第一个乒乓球和右边第一个乒乓球的权值…

ASP.NET Core 2.1带来SignalR、Razor类库

随着.NET Core 2.1的发布&#xff0c;微软推出了 ASP.NET Core 2.1。这是一个强大的版本&#xff0c;包括实时通信库SignalR&#xff0c;更新的模板使GDPR更容易遵守&#xff0c;并且针对Angular、React&#xff0c;以及React Redux更新了SPA模板。在2013年发布传统的ASP.NET时…

【bfs】WJ的逃离

WJ&#xff08;J&#xff09;的逃离 题目大意&#xff1a; 有一个nm的矩阵&#xff0c;*是不可走的&#xff0c;0是可走的&#xff0c;求1,1到n,m的最小转弯次数 原题&#xff1a; 题目描述 当WJ醒来时&#xff0c;发现自己被困在一个地图的左上角&#xff0c;幸好WJ有张图…

P2408- 不同子串个数【SA】

正题 题目链接:https://www.luogu.com.cn/problem/P2408 题目大意 给出一个字符串&#xff0c;求有多少个不同的子串。 解题思路 进行后缀排序之后&#xff0c;对于位置iii他有n−i1n-i1n−i1个后缀&#xff0c;然后它和排在它前面的后缀有heightiheight_iheighti​个重复的…

针对ASP.NET Core Web API的先进架构

.NET Core 最初是在2016年发布的&#xff0c;随着.NET Core 2.0的发布&#xff0c;微软拥有了下一个通用、模块化、跨平台和开源的平台主版本。.NET Core已经创建了许多API&#xff0c;在当前版本的.net框架中均可用。它最初是为下一代ASP.NET解决方案而创建的&#xff0c;但现…