description

给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3),

使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。


analysis

  • 找出一个长度为\(3\)的等差序列即可满足要求,长度为\(3\)的都没有,更长的序列也不存在

  • 暴力可以枚举每一个\(a[i]\),然后枚举\(x\),判断\(a[i]-x,a[i]+x\)是否在\(i\)位置前后,考虑优化这个\(O(n^2)\)

  • 从前往后插入每一个数,设当前位的数字是\(x\),若当前位一定不是某等差序列的中间位,意味着与\(x\)差相同的每一对数都出现过了

  • 如果在数的映射上,以\(x\)为中心的\(01\)串是回文串,则当前位为中间的等差序列不存在,否则就存在,这个比较好理解

  • 那么维护顺序、逆序的\(01\)串哈希就用线段树,从而快速判断回文串,时间复杂度\(O(n\log n)\)


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 50005
#define p 805306457
#define ha 1610612741
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll trl[MAXN],trr[MAXN];
ll a[MAXN],powp[MAXN];
ll n,T,flag; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline void modify(ll t,ll l,ll r,ll x)
{
if (l==r){trl[t]=trr[t]=p;return;}ll mid=(l+r)>>1;
x<=mid?modify(t<<1,l,mid,x):modify((t<<1)+1,mid+1,r,x); trl[t]=(trl[t<<1]*powp[(r-l+1)>>1]%ha+trl[(t<<1)+1])%ha;
trr[t]=(trr[t<<1]+trr[(t<<1)+1]*powp[r-l+1-((r-l+1)>>1)]%ha)%ha;
}
inline ll getl(ll t,ll l,ll r,ll x,ll y)
{
if (x>y)return 0;if (l==x && y==r)return trl[t];ll mid=(l+r)>>1; if (y<=mid)return getl(t<<1,l,mid,x,y);else if (x>mid)return getl((t<<1)+1,mid+1,r,x,y);
else return (getl(t<<1,l,mid,x,mid)*powp[y-mid]%ha+getl((t<<1)+1,mid+1,r,mid+1,y))%ha;
}
inline ll getr(ll t,ll l,ll r,ll x,ll y)
{
if (x>y)return 0;if (l==x && y==r)return trr[t];ll mid=(l+r)>>1; if (y<=mid)return getr(t<<1,l,mid,x,y);else if (x>mid)return getr((t<<1)+1,mid+1,r,x,y);
else return (getr(t<<1,l,mid,x,mid)+getr((t<<1)+1,mid+1,r,mid+1,y)*powp[mid-x+1]%ha)%ha;
}
int main()
{
//freopen("T1.in","r",stdin);
T=read(),powp[0]=1;
fo(i,1,40000)powp[i]=powp[i-1]*p%ha;
while (T--)
{
memset(trl,0,sizeof(trl));
memset(trr,0,sizeof(trr)),flag=0;
n=read();fo(i,1,n)a[i]=read();
fo(i,1,n)
{
ll x=a[i],len=min(x-1,n-x);
if (getl(1,1,n,x-len,x-1)!=getr(1,1,n,x+1,x+len)){flag=1;break;}
modify(1,1,n,x);
}
printf(flag?"Y\n":"N\n");
}
return 0;
}

【JZOJ1913】【BZOJ2124】等差子序列的更多相关文章

  1. bzoj2124: 等差子序列线段树+hash

    bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...

  2. [BZOJ2124]等差子序列/[CF452F]Permutation

    [BZOJ2124]等差子序列/[CF452F]Permutation 题目大意: 一个\(1\sim n\)的排列\(A_{1\sim n}\),询问是否存在\(i,j(i<j)\),使得\( ...

  3. BZOJ2124 等差子序列(树状数组+哈希)

    容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...

  4. [bzoj2124]等差子序列_线段树_hash

    等差子序列 bzoj-2124 题目大意:给定一个1~n的排列,问是否存在3个及以上的位置上的数构成连续的等差子序列. 注释:$1\le n\le 10^4$. 想法:这题就相当于是否存在3个数i,j ...

  5. [bzoj2124]等差子序列(hash+树状数组)

    我又来更博啦     2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 941  Solved: 348[Submit][Statu ...

  6. bzoj2124 等差子序列(hash+线段树)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 719  Solved: 261[Submit][Status][Discuss] ...

  7. BZOJ2124:等差子序列(线段树,hash)

    Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得A ...

  8. BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 2354  Solved: 826[Submit][Status][Discuss ...

  9. BZOJ2124: 等差子序列

    题意:给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap ...

  10. [bzoj2124]等差子序列——线段树+字符串哈希

    题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...

随机推荐

  1. .NET Core 使用 mongodb

    1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...

  2. php strncmp()函数 语法

    php strncmp()函数 语法 作用:比较字符串前n个字符,区分大小写 语法:strncmp(string1,string2,length)直线电机品牌 参数: 参数 描述 string1 必须 ...

  3. MIS(管理信息系统)

    MIS 管理信息系统(Management Information System,简称MIS) 是一个以人为主导,利用计算机硬件.软件.网络通信设备以及其他办公设备,进行信息的收集.传输.加工.储存. ...

  4. Unity编程标准导引-1.1下载和安装Unity

    本文为博主原创文章,欢迎转载,请保留出处:http://blog.csdn.net/andrewfan 1.1.下载和安装Unity 1.1.1 选取版本 首先找到Unity官方网站https://s ...

  5. HTTP返回码中200,302,304,404,500得意思

    状态码的职责是当客户端向服务器端发送请求时,描述返回请求结果.借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了什么错误. 2开头的,响应成功,客户端请求服务器正常响应处理了. 3开头的,响 ...

  6. Maven之自定义pom类型的基础项目

    摘要:在当前的软件开发场景中,大都是通过maven管理项目,而如果使用maven的话,其实也会有很多问题,比如项目中依赖的版本管理就是一个很头疼的事,如果一个项目中有很多人同时开发那么这就很可能造成大 ...

  7. git用法小结

      共享仓库     bare 裸仓库   生成裸仓库时必须以.git结尾.   仓库就相当于一个服务器     ### 创建远程仓库  1. 创建以.git结尾的目录mkdir repo.git 2 ...

  8. 用select实现多客户端连接

    server.c 把accept也看成是一个read类型的函数, 于是我们可以把sockfd也放入到select中 maxi标记当前客户端连接数组的最大下标 select返回值为当前已经准备就绪的fd ...

  9. HDU3951_Coin Game

    Coin Game Problem Description 一堆n个硬币围成一圈,两个人轮流拿走连续k个硬币,拿走最后一堆的人获胜 问你第一个人获胜还是第二个 思路: 这是NIM游戏改编版本 但是道理 ...

  10. SQL语句优化方式

    不要使用*号进行查询操作,使用具体字段. 索引 在where子句和order by 涉及的字段上合理的添加索引. where 子句优化 避免在where子句中对null值进行判断,应对字段设置默认值 ...