codevs 1283 等差子序列
http://codevs.cn/problem/1283/
给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap2,Ap3,…ApLen 是一个等差序列。
输入的第一行包含一个整数 T,表示组数。
下接 T 组数据,每组第一行一个整数 N,每组第二行为一个 1 到 N 的排列, 数字两两之间用空格隔开。
对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一 行“N”。
2
3
1 3 2
3
3 2 1
N
Y
对于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 等差子序列的更多相关文章
- 1893. [国家集训队2011]等差子序列(bitset)
★★ 输入文件:nt2011_sequence.in 输出文件:nt2011_sequence.out 简单对比时间限制:0.3 s 内存限制:512 MB [试题来源] 2011中国 ...
- BZOJ 2124: 等差子序列
Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- 2124: 等差子序列 - BZOJ
Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一个整数T,表示组数.下接 ...
- BZOJ 2124等差子序列 线段树&&hash
[题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...
- bzoj2124 等差子序列(hash+线段树)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 719 Solved: 261[Submit][Status][Discuss] ...
- BZOJ_2124_等差子序列_线段树+Hash
BZOJ_2124_等差子序列_线段树+Hash Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pL ...
- P2757 [国家集训队]等差子序列
P2757 [国家集训队]等差子序列 题目传送门 推荐一篇好题解 此题要求我们在一个序列中找出一个等差子序列. 显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为 ...
- CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...
随机推荐
- CDQ 分治算法模板
CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...
- 微信小程序天坑--图片汉字命名
图片用汉字命名的,在开发者工具中是显示的,但是,在真机的微信中,是不会显示的. 大写的尴尬,微信小程序开发者工具对于做微信的UI来说,就是一个天坑,在电脑上漂漂亮亮的,到手机上各种意想不到的情况.
- 浅析git
git是什么 简单来说,Git,它是一个快速的 分布式版本控制系统 (Distributed Version Control System,简称 DVCS) . 同传统的 集中式版本控制系统 (Cen ...
- python迭代和切片
from collections import Iterable #切片************************ # #取一个list或tuple的部分元素是非常常见的操作 ,Python提供 ...
- Java仪器数据文件解析-PDF文件
一.概述 使用pdfbox可生成Pdf文件,同样可以解析PDF文本内容. pdfbox链接:https://pdfbox.apache.org/ 二.PDF文本内容解析 File file = new ...
- 关于标准ui设计图转换为H5页面的终端适配
一些基本概念 在进行具体实战之前,首先得了解下面这些基本概念(术语): 视窗 viewport 简单的理解,viewport是严格等于浏览器的窗口.在桌面浏览器中,viewport就是浏览器窗口的宽度 ...
- SQL server 2008 安装提示:属性不匹配
问题 安装SQL server 2008提示属性不匹配 解决方案 确保C盘以及其子文件夹C:\Program Files\Microsoft SQL Server和C:\Program Files ( ...
- Maven-07: 插件的自定义绑定
除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上,这种自定义绑定方式能让Maven项目在构建过程中执行更多更富特色的任务. 一个常见的例子是创建项目的源码jar包.内置的插 ...
- Algorithm --> 求N以内的真分数个数
求N以内的真分数个数 For example, if N = 5, the number of possible irreducible fractions are 11 as below. 0 1/ ...
- NOIP2017划水崩盘记
Before-Day1 自信心爆棚,老子一定能拿省一.一天啥也没干,一顿乱奶.敬等明日切T1写暴力. Day 1 哈哈哈,T1是数论,闭眼睛切啊!! ...然后就Gg了,写的 ...