BZOJ2124: 等差子序列
题意:给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap2,Ap3,…ApLen 是一个等差序列。
按值建线段树,逐个插入,hash判断。
#include<bits/stdc++.h>
#define N (1<<15)
#define M (l+r>>1)
#define P (k<<1)
#define S (k<<1|1)
#define K l,r,k
#define L l,M,P
#define R M+1,r,S
#define Z \
int l=0,int r=n,int k=1
using namespace std;
int n,q;
typedef unsigned long long ull;
const ull base=23;
ull d[N],u[N],v[N];
void amend(int s,int t,Z){
if(l==r)
u[k]=v[k]=s;
else{
if(t<=M)
amend(s,t,L);
else
amend(s,t,R);
u[k]=u[P]+u[S]*d[M-l+1];
v[k]=v[S]+v[P]*d[r-M];
}
}
ull Q1(int s,int t,Z){
return s==l&&t==r?u[k]:t<=M?Q1(s,t,L):s>M?Q1(s,t,R):Q1(s,M,L)+Q1(M+1,t,R)*d[M-s+1];
}
ull Q2(int s,int t,Z){
return s==l&&t==r?v[k]:t<=M?Q2(s,t,L):s>M?Q2(s,t,R):Q2(M+1,t,R)+Q2(s,M,L)*d[t-M];
}
bool check(){
memset(u,0,sizeof u);
memset(v,0,sizeof v);
static int a[N];
for(int i=0;i!=n;++i)
scanf("%d",a+i);
for(int i=0;i!=n;amend(1,a[i++]))
if(int j=min(a[i]-1,n-a[i]))
if(Q1(a[i]+1,a[i]+j)^Q2(a[i]-j,a[i]-1))
return 1;
return 0;
}
int main(){
d[0]=1;
for(int i=1;i!=N;++i)
d[i]=d[i-1]*base;
for(scanf("%d",&q);q;--q){
scanf("%d",&n);
puts(check()?"Y":"N");
}
}
BZOJ2124: 等差子序列的更多相关文章
- bzoj2124: 等差子序列线段树+hash
bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...
- [BZOJ2124]等差子序列/[CF452F]Permutation
[BZOJ2124]等差子序列/[CF452F]Permutation 题目大意: 一个\(1\sim n\)的排列\(A_{1\sim n}\),询问是否存在\(i,j(i<j)\),使得\( ...
- BZOJ2124 等差子序列(树状数组+哈希)
容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...
- [bzoj2124]等差子序列_线段树_hash
等差子序列 bzoj-2124 题目大意:给定一个1~n的排列,问是否存在3个及以上的位置上的数构成连续的等差子序列. 注释:$1\le n\le 10^4$. 想法:这题就相当于是否存在3个数i,j ...
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- bzoj2124 等差子序列(hash+线段树)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 719 Solved: 261[Submit][Status][Discuss] ...
- BZOJ2124:等差子序列(线段树,hash)
Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得A ...
- BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 2354 Solved: 826[Submit][Status][Discuss ...
- [bzoj2124]等差子序列——线段树+字符串哈希
题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...
随机推荐
- Linux中sudo配置
Linux下的sudo及其配置文件/etc/sudoers的详细配置. 1.sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的ro ...
- window php redis扩展下载地址
redis扩展下载 http://windows.php.net/downloads/pecl/snaps/redis/
- eclipse下package的命名规范
Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...
- [oracle] 解决ORA-30036:无法按8扩展段(在还原表空间‘XXXX’中)
select * from dba_data_files awhere a.TABLESPACE_NAME='UNDOTBS' alter tablespace UNDOTBS add datafil ...
- [转]servlet中的service, doGet, doPost方法的区别和联系
原文地址:http://m.blog.csdn.net/blog/ghyg525/22928567 大家都知道在javax.servlet.Servlet接口中只有init, service, des ...
- mysql 注释
mysql> SELECT 1+1; # This comment continues to the end of line mysql> SELECT 1+1; -- This comm ...
- mybatis学习(一) mybatis框架的特性
mybatis 的源代码地址是https://github.com/mybatis/mybatis-3/ 以及相关文档 All the information i get from http://ww ...
- 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏
考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...
- hdu1521 指数型母函数
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- asp.net MVC中使用entity framework出现从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”的处理
方法一: 使用DateTime类型的字段在作为参数传入到数据库前记得赋值,并日期要大于1753年1月1日. 方法二: 将DateTime类型的字段修改为DateTime?类型,由于可空类型的默认值都是 ...