http://codevs.cn/problem/1283/

题目描述 Description

给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap2,Ap3,…ApLen 是一个等差序列。

 
输入描述 Input Description

输入的第一行包含一个整数 T,表示组数。

下接 T 组数据,每组第一行一个整数 N,每组第二行为一个 1 到 N 的排列, 数字两两之间用空格隔开。

 
输出描述 Output Description

对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一 行“N”。

 
样例输入 Sample Input

2

3

1 3 2

3

3 2 1

 
样例输出 Sample Output

N

Y

 
数据范围及提示 Data Size & Hint

对于5%的数据,N<=100,对于30%的数据,N<=1000,对于100%的数据,N<=10000,T<=7

线段树+hash

首先要注意的是这个排列是1到n的排列

然后当然是找3个数形成等差子序列

暴力:枚举中间的数,枚举左边的数,枚举右边的数,看是否满足 2*mid=l+r

O(n³)

继续想,因为保证排列是1到n

所以对于一个数x,若以x为mid能形成等差子序列,那么另外两个数一定在x两侧

即从左往右枚举,当枚举到mid时,能早就枚举到了l,不能枚举到r

可以用0,1表示这个数是否被枚举到

举个例子:

3 6 1 2 4 5

当枚举到第5个数4时,0 1序列为

1 1 1 1 0 1

4的左边分别是1和0,说明枚举到4时,3已经被枚举到了,5还没有被枚举

但这样仍然要枚举,没有减少时间复杂度

如何去掉枚举的过程?

继续想,发现我们要比较的是mid左右的两个对称区间

举个例子:

1 8 3 6 5 7 4 2

当枚举到3时,0 1序列为:

1 0 1 0 0 0 0 1

我们实际需要的是判断2和4的01序列是否相等,1和5的01序列是否相等

因为是对称的

可以转化为判断区间[1,2]和区间[5,4](注意这里是[5,4],不是[4,5])是否相等

线段树维护区间正序哈希值和倒序哈希值,即可log判断

总复杂度:O(nlogn)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10001
#define LL unsigned long long
using namespace std;
int T,n,x,len;
bool ok;
LL bit[N],hash[N*],anti_hash[N*],r1,r2;
struct TREE
{
public:
void up(int k,int l,int r)
{
hash[k]=hash[k<<]*bit[r-(l+r>>)]+hash[k<<|];
anti_hash[k]=anti_hash[k<<|]*bit[(l+r>>)-l+]+anti_hash[k<<];
}
void change(int k,int l,int r,int pos)
{
if(l==r)
{
anti_hash[k]=hash[k]=;
return;
}
int mid=l+r>>;
if(pos<=mid) change(k<<,l,mid,pos);
else change(k<<|,mid+,r,pos);
up(k,l,r);
}
LL query(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl&&r<=opr) return w== ? hash[k]:anti_hash[k];
int mid=l+r>>;
if(opr<=mid) return query(k<<,l,mid,opl,opr,w);
else if(opl>mid) return query(k<<|,mid+,r,opl,opr,w);
else if(w==) return query(k<<,l,mid,opl,mid,w)*bit[opr-mid]+query(k<<|,mid+,r,mid+,opr,w);
else return query(k<<|,mid+,r,mid+,opr,w)*bit[mid-opl+]+query(k<<,l,mid,opl,mid,w);
}
void solve(int i)
{
len=min(i-,n-i);
r1=query(,,n,i-len,i-,);
r2=query(,,n,i+,i+len,);
if(r1!=r2) ok=true;
}
}tree;
int main()
{
bit[]=; for(int i=;i<N;i++) bit[i]=bit[i-]*;
scanf("%d",&T);
while(T--)
{
memset(hash,,sizeof(hash));
memset(anti_hash,,sizeof(anti_hash));
scanf("%d",&n);
ok=false;
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(!ok)
{
tree.change(,,n,x);
if(x!=&&x!=n) tree.solve(x);
}
}
if(ok) puts("Y");
else puts("N");
}
}

codevs 1283 等差子序列的更多相关文章

  1. 1893. [国家集训队2011]等差子序列(bitset)

    ★★   输入文件:nt2011_sequence.in   输出文件:nt2011_sequence.out   简单对比时间限制:0.3 s   内存限制:512 MB [试题来源] 2011中国 ...

  2. BZOJ 2124: 等差子序列

    Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...

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

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

  4. 2124: 等差子序列 - BZOJ

    Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一个整数T,表示组数.下接 ...

  5. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

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

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

  7. BZOJ_2124_等差子序列_线段树+Hash

    BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...

  8. P2757 [国家集训队]等差子序列

    P2757 [国家集训队]等差子序列 题目传送门 推荐一篇好题解 此题要求我们在一个序列中找出一个等差子序列. 显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为 ...

  9. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

随机推荐

  1. Emacs配置(考场必备)(Emacs)

    最近有几次离开自己一直坐着的座位,去别的机房考试了. 于是猛然想起来要记一记Emacs的简洁配置了. 算是把NOIP残存的记忆再拾一点起来...... 附上一些解释 (global-set-key [ ...

  2. 【LightOJ1282】Leading and Trailing(数论)

    [LightOJ1282]Leading and Trailing(数论) 题面 Vjudge 给定两个数n,k 求n^k的前三位和最后三位 题解 这题..真的就是搞笑的 第二问,直接输出快速幂\(m ...

  3. webpack中hash与chunkhash区别和需要注意的问题

    项目发布时,为了解决缓存,需要进行md5签名,这时候就需要用到 hash 和 chunkhash等. 问题一:hash问题 使用 hash 对js和css进行签名时,每一次hash值都不一样,导致无法 ...

  4. eclipse中Maven项目pom.xml报错:com.thoughtworks.xstream.io.HierarchicalStreamDriver

    eclipse中创建Maven项目时 pom.xml报错:com.thoughtworks.xstream.io.HierarchicalStreamDriver 解决方案1.在pom文件中加入mav ...

  5. python 全栈开发,Day6

    python之函数进阶 一.引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 执行报错: Name ...

  6. delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法

    delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var  Bi ...

  7. 新手立体四子棋AI教程(1)——基础扫盲

    一.引言 最近身边好几个朋友开始玩立体四子棋,激起了我的好奇心.那么首先来说什么是[立体四子棋],规则又是如何呢? 上图即为立体四子棋,规则类似于五子棋四子连在一起,但是四子棋更加多样.丰富.不仅可以 ...

  8. 利用Java生成UUID

    UUID是什么? UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分.其目的,是 ...

  9. K-Means 聚类

    机器学习中的算法主要分为两类,一类是监督学习,监督学习顾名思义就是在学习的过程中有人监督,即对于每一个训练样本,有对应的标记指明它的类型.如识别算法的训练集中猫的图片,在训练之前会人工打上标签,告诉电 ...

  10. Redis+Restful 构造序列号和压力测试【原创】

    [本人原创],欢迎交流和分享技术,转载请附上如下内容:如果你觉得这篇文章对你有帮助,请记得帮我点赞, 谢谢!作者:kevin[转自]http://www.cnblogs.com/itshare/ 很多 ...