Description

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

Input

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

Output

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

Sample Input

2

3

1 3 2

3

3 2 1

Sample Output

N

Y

HINT

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

首先觉得题目不错(2013年我竟然在wikioi过了,代码还很短,然后把代码翻出来,发现是暴力n方加优化代码。。。。。。汗,我当时怎么想的)

今天看到题目觉得没什么想法,于是就翻了题解http://seter.is-programmer.com/posts/31902.html

就是维护每一个数字a[i]之前出现a[i]-1,a[i]-2,a[i]-3...的出现情况和a[i]+1,a[i]+2,a[i]+3...的出现情况(用二进制)

如果这两个二进制数的第k位不同,那么就是a[i]-k在a[i]前出现了,a[i]+k在a[i]之后出现或者a[i]+k在a[i]前出现了,a[i]-k在a[i]之后出现,所以我们只要判断两个二进制不同,就可以用hash值来判断了(不放心的话可以做两个hash),用线段树维护hash值就行了

 const
maxn=;
h=;
type
node=record
l,r,lc,rc:longint;
h1,h2:int64;
end;
var
f:array[..maxn*]of node;
a:array[..maxn]of longint;
p:array[..maxn]of int64;
t,n,tot:longint; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure add(x,now:longint);
var
mid:longint;
begin
if f[now].l=f[now].r then
begin
f[now].h1:=;
f[now].h2:=;
exit;
end;
mid:=(f[now].l+f[now].r)>>;
if x>mid then add(x,f[now].rc)
else add(x,f[now].lc);
f[now].h1:=(f[f[now].lc].h1*p[f[now].r-mid]+f[f[now].rc].h1)mod h;
f[now].h2:=(f[f[now].rc].h2*p[mid-f[now].l+]+f[f[now].lc].h2)mod h;
end; procedure build(l,r:longint);
var
now,mid:longint;
begin
inc(tot);
now:=tot;
f[now].l:=l;
f[now].r:=r;
f[now].h1:=;
f[now].h2:=;
f[now].lc:=;
f[now].rc:=;
if l=r then exit;
mid:=(l+r)>>;
f[now].lc:=tot+;
build(l,mid);
f[now].rc:=tot+;
build(mid+,r);
end; function hash1(l,r,now:longint):int64;
var
mid:longint;
begin
if (l<=f[now].l) and (r>=f[now].r) then exit(f[now].h1);
mid:=(f[now].l+f[now].r)>>;
if l>mid then exit(hash1(l,r,f[now].rc));
if r<=mid then exit(hash1(l,r,f[now].lc));
exit((hash1(l,r,f[now].lc)*p[min(r,f[now].r)-mid]+hash1(l,r,f[now].rc))mod h);
end; function hash2(l,r,now:longint):int64;
var
mid:longint;
begin
if (l<=f[now].l) and (r>=f[now].r) then exit(f[now].h2);
mid:=(f[now].l+f[now].r)>>;
if l>mid then exit(hash2(l,r,f[now].rc));
if r<=mid then exit(hash2(l,r,f[now].lc));
exit((hash2(l,r,f[now].rc)*p[mid-max(l,f[now].l)+]+hash2(l,r,f[now].lc))mod h);
end; procedure main;
var
i:longint;
begin
read(n);
for i:= to n do
read(a[i]);
tot:=;
build(,n);
for i:= to n- do
begin
add(a[i-],);
if hash1(a[i]-min(a[i]-,n-a[i]),a[i],)=hash2(a[i],a[i]+min(a[i]-,n-a[i]),) then continue;
writeln('Y');
exit;
end;
writeln('N');
end; begin
p[]:=;
for t:= to maxn do
p[t]:=p[t-]* mod h;
read(t);
while t> do
begin
dec(t);
main;
end;
end.

2124: 等差子序列 - BZOJ的更多相关文章

  1. bzoj 2124 等差子序列 (线段树维护hash)

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

  2. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...

  3. BZOJ 2124: 等差子序列

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

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

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

  5. bzoj 2124 等差子序列 树状数组维护hash+回文串

    等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1919  Solved: 713[Submit][Status][Discuss] Desc ...

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

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

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

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

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

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

  9. BZOJ [P2124] 等差子序列

    线段树维护哈希值 要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了 初看本题没有思路,只能暴力枚举,O(n^4) 后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次 我们可以 ...

随机推荐

  1. php学习笔记5--php中的可变变量,可变函数及匿名函数

    可变变量指的是:将一个变量的值再次当做一个变量名从而得到另外一个变量的值.如:$name = 'dqrcsc';$myname = 'name'; //$myname的值碰巧是另一个变量的变量名ech ...

  2. android sqlite操作(2)

    以下只是我个人的浅见,大神请忽略~ 这一篇说一下sqlite的相关操作,其实安卓提供了相当多的操作sqlite的方法,这里我介绍下我常用的方法. (1)创建一个数据库文件,这个很简单 File dbP ...

  3. CSS之Generator

    这个工具可以,收藏一下.CSS Generator

  4. view, surfaceView, invalidate, postInvalidate, 刷新屏幕

    http://blog.csdn.net/linghu_java/article/details/9985489 1.view view在api中的结构 Java.lang.Object Androi ...

  5. 洛谷 P3368 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  6. C++将类的构造函数、析构函数声明为private或者protected的用途

    如果将构造函数.析构函数声明为private或者protected,表示不能从类的外部正常调用构造和析构函数了. 这种用法的通常使用的场景如下: 1.如果不想让外面的用户直接构造一个类A的对象,而希望 ...

  7. 【OSG细节实现】节点围绕位于axisPos平行于axis的轴进行旋转

    //绕着与axis平行的任意轴旋转 void rotate(const std::string& name, float angle, osg::Vec3 axisPos, osg::Vec3 ...

  8. search help 概述

    所谓search help 就是在前台调出一个query 得到一个value list 让用户选择需要的值 我们要做的就是给某些表/视图 设计一个可供查询的query 然后把这个query绑定到需要的 ...

  9. Linux ThunderBird Exchange 过期

    在Linux上只用Web版处理邮件,就是因为找不到太好的能支持Exchange的邮件客户端.在网上无意中发现了ExQuilla这个Thunderbird的插件,试用了一下还是不错的,很方便,不过只能免 ...

  10. MongoDB五种树形结构表示法

    MongoDB五种树形结构表示法 第一种:父链接结构 db.categories.insert( { _id: "MongoDB", parent: "Databases ...