Bzoj2124(p5364): 等差子序列
题目描述
给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3),
使得Ap1,Ap2,Ap3,…ApLen是一个等差序列。
输入
输入的第一行包含一个整数T,表示组数。
下接T组数据,每组第一行一个整数N,每组第二行为一个1到N的排列,数字两两之间用空格隔开。
N<=10000,T<=7
输出
对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一行“N”。
样例输入
2
3
1 3 2
3
3 2 1
样例输出
N
Y
考虑什么时候不存在等差数列
把出现过的数字对应位置赋成1,没出现过的为0
那么扫到i时,以a[i]为中心的串如果是回文,那么就不存在以a[i]为中心的等差数列
考虑用线段树维护正反两种hash值,详情看代码吧233
这题做的时候一次忘关调试信息了,然后删的时候还不小心删多了。。。(ノへ ̄、)
#include<cstdio>
#include<cstring>
#define ull unsigned long long
using namespace std;
int T,n,a[];
ull sum1[],sum2[],hsh[];
void add(int x,int l,int r,int q){
if(l==q&&r==q){
sum1[x]=sum2[x]=;
return;
}
int mid=(l+r)/;
if(q<=mid)add(x+x,l,mid,q);
else add(x+x+,mid+,r,q);
sum1[x]=sum1[x+x]*hsh[r-mid]+sum1[x+x+];
sum2[x]=sum2[x+x]+sum2[x+x+]*hsh[mid-l+];
}
ull query(int x,int l,int r,int L,int R,int t){
if(l==L&&r==R){
if(t==)return sum1[x];
else return sum2[x];
}
int mid=(l+r)/;
if(R<=mid)return query(x+x,l,mid,L,R,t);
else if(L>mid)return query(x+x+,mid+,r,L,R,t);
else{
if(t==)return query(x+x,l,mid,L,mid,t)*hsh[R-mid]+query(x+x+,mid+,r,mid+,R,t);
else return query(x+x,l,mid,L,mid,t)+query(x+x+,mid+,r,mid+,R,t)*hsh[mid-L+];
}
}
ull A,B;
int main(){
scanf("%d",&T);
hsh[]=;
for(int i=;i<=;i++)hsh[i]=hsh[i-]*;
while(T--){
bool ok=;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++){
if(ok){
if(a[i]<=n/){
A=query(,,n,,*a[i]-,);
B=query(,,n,,*a[i]-,);
}
else{
A=query(,,n,*a[i]-n,n,);
B=query(,,n,*a[i]-n,n,);
}
if(A!=B)ok=;
add(,,n,a[i]);
}
else break;
}
if(ok)printf("N\n");
else printf("Y\n");
memset(sum1,,sizeof(sum1));
memset(sum2,,sizeof(sum2));
}
return ;
}
Bzoj2124(p5364): 等差子序列的更多相关文章
- 【BZOJ2124】等差子序列 树状数组维护hash值
[BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...
- 【bzoj2124】等差子序列 STL-bitset
题目描述 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3),使得Ap1,Ap2,A ...
- 【JZOJ1913】【BZOJ2124】等差子序列
description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<-<pLen<=N (Len>=3), 使得A ...
- bzoj2124: 等差子序列线段树+hash
bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...
- BZOJ2124 等差子序列(树状数组+哈希)
容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...
- [BZOJ2124]等差子序列/[CF452F]Permutation
[BZOJ2124]等差子序列/[CF452F]Permutation 题目大意: 一个\(1\sim n\)的排列\(A_{1\sim n}\),询问是否存在\(i,j(i<j)\),使得\( ...
- [bzoj2124]等差子序列_线段树_hash
等差子序列 bzoj-2124 题目大意:给定一个1~n的排列,问是否存在3个及以上的位置上的数构成连续的等差子序列. 注释:$1\le n\le 10^4$. 想法:这题就相当于是否存在3个数i,j ...
- [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] ...
随机推荐
- @Resource与@Autowired区别
每次理解清楚,过段时间就忘了,还是记一下,方便之后再回看. @ Autowired 是spring提供,包含3种自动装配Bean形式 1.@Autowired默认按类型byType匹配,自动装配Bea ...
- Java经典线程同步问题------生产者与消费者
先上代码 class Test { public static void main(String []args) { Queue q=new Queue(); Producer p=new Produ ...
- android 经典博客
http://blog.csdn.net/harvic880925/article/category/1707319
- php错误抑制符
php错误抑制符 简介 PHP 支持一个错误控制运算符:@.当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉. @这个符号在Java里面是注解符号. 实例 <?ph ...
- 2014/09/20 关于ArrayList的几种操作
1.删除ArrayList集合元素 删除ArrayList集合里面的元素时,提供了Clear方法,Remove方法,RmoveAt方法和RemoveRange方法. Clear方法是移除所有的元素 R ...
- H3C路由器查看序列号信息
H3C MSR系列的路由器,查看本机的MAC地址.序列号信息和生产日期信息等可以使用dis device manuinfo 命令查看,以下是执行结果: slot 0 DEVICE_NAME ...
- [XJOI]noip45 T2 图
***图*** 解题思路:这题的原题似乎好像是NOI某年的题目,然后数据改水了 于是就可以用一些简单的最短路算法水掉. 因为他是要求max(a)+max(b)的值,所以单纯的最短路是不行的 我们可以枚 ...
- ManualResetEvent和AutoResetEvent的区别,分享来的
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...
- ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)
1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...
- YCbCr to RGB and RGB toYCbCr
RGB => YCbCr: Y = 0.299R + 0.587G + 0.114BCb = -0.1726R - 0.3388G + 0.5114B + 128Cr = 0.5114R - 0 ...