bzoj2124 等差子序列(hash+线段树)
2124: 等差子序列
Time Limit: 3 Sec Memory Limit: 259 MB
Submit: 719 Solved: 261
[Submit][Status][Discuss]
Description
给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。
Input
输入的第一行包含一个整数T,表示组数。下接T组数据,每组第一行一个整数N,每组第二行为一个1到N的排列,数字两两之间用空格隔开。
Output
对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一行“N”。
Sample Input
3
1 3 2
3
3 2 1
Sample Output
Y
HINT
对于100%的数据,N<=10000,T<=7
Source
【思路】
转化+hash+线段树。
首先需要明确的一点:A是一个1..n的排列。
其次将出现情况统计为01字符串分别表示该数字目前为止是否出现,因此对于一个数字当前没有出现以后一定会出现。例如对于{5,2,1,4,3,6}且已经扫到了4,则有01状态为110010,可以看出如果有一对数字以4为中心分别为01则一定有等差数列。又因为非0即1的性质,所以问题可以转化为两个字串是否相等的问题,对应到例子中即s(2,3)是否等于s(6,5),如果相等则必无等差数列反之则必有一个或多个等差数列。
线段树维护hash,[区间查询单点修改],O(logn)的查询时间,O(logn)的维护时间,总时间为O(nlogn)。
注:求Hash对应一个区间查询。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long LL;
const int maxn = +;
const int MOD = ; int read() {
char c=getchar();
while(!isdigit(c)) c=getchar();
int x=;
while(isdigit(c)) {
x=x*+c-'';
c=getchar();
}
return x;
} int n;
int a[maxn],xp[maxn]; LL sumv[*maxn][];
int v;
void update(int u,int L,int R) {
int lc=u<<,rc=lc+;
if(L==R) {
sumv[u][]=sumv[u][]=;
}
else {
int M=L+(R-L)/;
if(v<=M) update(lc,L,M);
else update(rc,M+,R);
sumv[u][]=(sumv[rc][]+xp[R-M]*sumv[lc][]%MOD)%MOD;
sumv[u][]=(sumv[lc][]+xp[M-L+]*sumv[rc][]%MOD)%MOD;
}
}
LL query(int node,int l,int r,int a,int b,int x){
int lc=node<<,rc=lc+;
if(l==a&&r==b)return sumv[node][x];
int m=(l+r)>>;
LL left=,right=;
if(m<b)right=query(rc,m+,r,max(m+,a),b,x);
if(a<=m)left=query(lc,l,m,a,min(m,b),x);
return (x?left+right*xp[max(,m-a+)]%MOD:right+left*xp[max(,b-m)]%MOD)%MOD;
}
int main()
{
freopen("cin.in","r",stdin);
freopen("coutme.out","w",stdout);
int T;
T=read();
while(T--) {
memset(sumv,,sizeof(sumv));
n=read();
xp[]=; FOR(i,,n+) xp[i]=(xp[i-]<<)%MOD;
FOR(i,,n) a[i]=read();
bool f=;
FOR(i,,n) {
int x=a[i];
LL lf,rf;
int len=min(x-,n-x);
if(len&&query(,,n,x-len,x-,)!=query(,,n,x+,x+len,)){
f=;
break;
}
v=x;
update(,,n);
}
if(f) printf("Y\n");
else printf("N\n");
}
return ;
}
bzoj2124 等差子序列(hash+线段树)的更多相关文章
- [bzoj2124]等差子序列_线段树_hash
等差子序列 bzoj-2124 题目大意:给定一个1~n的排列,问是否存在3个及以上的位置上的数构成连续的等差子序列. 注释:$1\le n\le 10^4$. 想法:这题就相当于是否存在3个数i,j ...
- BZOJ_2124_等差子序列_线段树+Hash
BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- 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:等差子序列(线段树,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}\)是一个等差序列. 题解 显然 ...
- BZOJ2124 等差子序列(树状数组+哈希)
容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...
随机推荐
- C## 输出Hello world
首先新建一个项目 然后在文件D:\C##Obj\HelloWorld\HelloWorld\Program.cs using System; using System.Collections.Gene ...
- 内存泄漏在 WPF 和 Silverlight 提防
瑞奇韭菜礼物 ︰ 内存泄漏在 WPF 和 Silverlight 提防 内存泄漏在 WPF 和 Silverlight 提防 WPF 和 Silverlight 允许您定义您的用户界面,用最少的代码将 ...
- MyEclipse起步Tomcat报错“A configuration error occurred during…” MyEclipse起步Tomcat报错“A configuration error occurred during…”
- IOS常用开源库
转自:http://www.csdn.net/article/2013-06-18/2815806-GitHub-iOS-open-source-projects-two/1 1. AFNetwork ...
- 【BZOJ2653】【主席树+二分】middle
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- CentOS7下安装配置vncserver
之前试了xmanager,不过好像和在centos6有很大不同,居然没成功,然后找到了vncserver,试了下,成了 参考:http://blog.csdn.net/jiangliqing1234/ ...
- PHPCMS V9调用时间标签 |日期时间格式化
PHPCMS V9 如何调用时间标签,下面分享常见的调用时间标签 |日期时间格式化 1.日期时间格式化显示: a标准型:{date('Y-m-d H:i:s', $rs['inputtime'])} ...
- Flask-SQLALchemy查询
from: http://blog.sina.com.cn/s/blog_633277f90100kpvm.html 似乎ORM最难设计的部分是查询.特别是面向对象的查询,今天学习SQLAlchemy ...
- Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五)
Solr4.8.0源码分析(24)之SolrCloud的Recovery策略(五) 题记:关于SolrCloud的Recovery策略已经写了四篇了,这篇应该是系统介绍Recovery策略的最后一篇了 ...
- MVC身份验证及权限管理
MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身份认证微软为我们提供了三种方式,其中最常用的就是我们的Form认证,需要配置相应的信息.例如下面的配置信息: < ...