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. MVC 使用Jquery实现AJax

    View <script type="text/javascript"> function GetTime() { $.get("Home/GetTime&q ...

  2. 路由器之VPN应用与配置指南

    应用背景 近日,公司需要在外人员通过直接访问连接到公司内网,实现办公等一系列操作,这个时候就需要通过配置路由器VPN实现该需求了. 无线企业路由器可以帮助中小型企业搭建高性价比.稳定的企业办公网络,灵 ...

  3. 在window 下安装Memcache详解

    有时候我们需要在本地测试的时候就用到memcahce,如果本地没有安装memcache,就会有下面的错误提示: 1234567 系统发生错误 您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ...

  4. MVC自定义错误页404静态页

    昨天公司要求给所有项目添加自定义404错误页,具体的要求实现的有以下几点: 1.实现自定义错误(如各种error,404等)跳转到指定的页面 2.所指定的页面输出的http状态值必须是404或其他指定 ...

  5. C语言知识总结(4)

    变量的作用域 C语言根据变量作用域的不同,将变量分为局部变量和全局变量 1.局部变量 1> 定义:在函数内部定义的变量,称为局部变量.形式参数也属于局部变量. 2> 作用域:局部变量只在定 ...

  6. Regsvr32注册ActiveX控件

    命令:Regsvr32 XX.dll 注册ActiveX控件 Regsvr32命令参数:/u 卸载ActiveX控件/s 注册成功后不显示操作成功信息框/c 控制台输出/I 调用DllInstall安 ...

  7. [译]开始学习webpack

    写在前面: 文章翻译自petehunt大神的petehunt/webpack-howto,作为学习webpack的开始.fork了一份,翻译后的在这里https://github.com/zjzhom ...

  8. SilverLight命名空间详解-新手入门

    1.核心命名空间 1.xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"是silverlight的核 ...

  9. 《LDAP服务器的配置与客户端的测试》RHEL6——第一篇 运维工程师必考

    ldap这种原始的服务器搭建起来比较复杂,同时它也是CE必考的(客户端的搭建). 服务器端的配置: 1.安装openldap-servers软件包 2.查看ldap模板文件的存放位置: 3.拷贝lda ...

  10. picLazyLoad 图片延时加载,包含背景图片

    /** * picLazyLoad 图片延时加载,包含背景图片 * $(img).picLazyLoad({...}) * data-original 预加载图片地址 * alon */ ;(func ...