2124: 等差子序列 - BZOJ
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的更多相关文章
- bzoj 2124 等差子序列 (线段树维护hash)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1922 Solved: 714[Submit][Status][Discuss ...
- BZOJ 2124: 等差子序列 线段树维护hash
2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...
- BZOJ 2124: 等差子序列
Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...
- BZOJ 2124等差子序列 线段树&&hash
[题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- [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 -> bitset 求是否存在长度为3的等差数列)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 2354 Solved: 826[Submit][Status][Discuss ...
- BZOJ [P2124] 等差子序列
线段树维护哈希值 要求出现长度大于三的等差子序列,我们只要找到长度等于三的就可以了 初看本题没有思路,只能暴力枚举,O(n^4) 后来发现,这个序列是n的一个排列,那么每个数字都只会出现一次 我们可以 ...
随机推荐
- T-SQL openquery 删除报错 “键列信息不足或不正确。更新影响到多行”
DELETE OPENQUERY (VERYEAST_MAIN_MYSQL_CONN, 'SELECT college_userid FROM college_student_information ...
- 很全的corel图像分类,场景识别图像库
这是真正的Corel-5K图像集,共包含科雷尔(Corel)公司收集整理的5000幅图片,故名:Corel-5K,童鞋们可用于科学图像实验:分类.检索等.Corel-5k数据集是图像实验的事实标准数据 ...
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- OSI参考模型
1.物理层:发送和接收比特.(工作在物理层的集线器) 2.数据链路层:提供数据的物理传输,并处理错误通知.网络拓扑和流浪控制, 数据链路层将报文封装成数据帧,并添加定制的报头,其中包括目标硬件地址, ...
- hdu 2057 A+B Again
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 题目分析:涉及到16进制内的加法,可以用%I64x直接来处理,要注意到16进制中负数是用补码来表 ...
- Vim保存文件命令 ":wq" 与 ":x" 的区别
CSDN转载 [1] Vim是Unix/Linux系统最常用的编辑器之一,在保存文件时,我通常选择":wq",因为最开始学习vim的时候,就只记住了几个常用的命令:也没有细究命令的 ...
- java集合学习一
首先看一下java集合的关系图 1.1从全面了解Java的集合关系图.常见集合 list set map等其中我们最常用的 list map 结合.几天说一下常见的map.map在我工作的两年里 ...
- 更新win7资源管理器
更新exeplorer.exe: 1.方法1: void RefreshExplorer() { ]; SHELLEXECUTEINFOA shellExeInfo={}; shellExeInfo. ...
- ant条件逻辑
<condition property="sdk-folder" value="E:\android\android-sdk\adt-bundle-windows- ...
- WP开发笔记——阻止Back后退键
WP7中如何阻止Back后退键的后退事件呢? WP7上提供了物理的Back按键,获取Back物理键按下可以通过PhoneApplicationPage的BackKeyPress事件. 具体实现方法如下 ...