等差子序列(sequence)
等差子序列(sequence)
题目描述
给一个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
solution
首先只要有3个数满足,那么就行了
我们枚举中间的数ai
我们可以记录每一个数值是否出现过:记为p
如果p是一个以a[i]为对称轴的回文串,那么就是不合法的。
也就是a[i-x],a[i+x]出现状况相同
这个可以用哈希实现
现在我们要维护哈希值,支持修改,区间查询
树状数组啦
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 10005
#define ll unsigned long long
#define p 1000000007
using namespace std;
int T,n,a[maxn];
ll ha[maxn],hb[maxn],po[maxn];
void cle(){
for(int i=1;i<=n;i++)ha[i]=hb[i]=0;
}
void add_a(int i,ll v){
for(;i<=n;i+=i&-i)ha[i]+=v;
}
void add_b(int i,ll v){
for(;i<=n;i+=i&-i)hb[i]+=v;
}
ll ask_a(int i){
ll sum=0;for(;i;i-=i&-i)sum+=ha[i];
return sum;
}
ll ask_b(int i){
ll sum=0;for(;i;i-=i&-i)sum+=hb[i];
return sum;
}
int main()
{
cin>>T;
while(T--){
cle();
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
po[0]=1;for(int i=1;i<=n;i++)po[i]=po[i-1]*p;
bool f=0;
//for(int i=1;i<=n;i++)add_b(a[i],po[n-a[i]+1]);
for(int i=1;i<=n;i++){
add_a(a[i],po[a[i]]);add_b(a[i],po[n-a[i]+1]);
int M=min(a[i],n-a[i]+1);
//cout<<"i "<<i<<' '<<a[i]<<' '<<M<<endl;
ll t1=ask_a(a[i])-ask_a(a[i]-M);
ll t2=ask_b(a[i]+M-1)-ask_b(a[i]-1);
if(a[i]<n-a[i]+1)t1=t1*po[n-a[i]+1-a[i]];
else t2=t2*po[a[i]-(n-a[i]+1)];
//cout<<t1<<' '<<t2<<endl;
if(t1!=t2){f=1;break;}
}
if(f)puts("Y");else puts("N");
}
return 0;
}
等差子序列(sequence)的更多相关文章
- 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] ...
- codevs 1283 等差子序列
http://codevs.cn/problem/1283/ 题目描述 Description 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4& ...
- 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\)的等差子序列.可以枚举等差子 ...
随机推荐
- 还在使用pdf、word简历?简单五步实现github托管个人逼格简历
写在前面: 什么是git.github? git 版本控制工具 github 通过git工具做的版本控制的项目托管平台 项目开发肯定不止一个程序猿,多个程序猿针对同一个文件进行代码读写操作时,是先保存 ...
- 使用file_get_contents()和curl()抓取网络资源的效率对比
使用file_get_contents()和curl()抓取网络资源的效率对比 在将小程序用户头像合成海报的时候,用到了抓取用户头像对应的网络资源,那么抓取方式有很多,比如 file_get_cont ...
- php-5.6.26源代码 - 扩展模块的加载、注册
// main实现在文件 php-5.6.26\sapi\cgi\cgi_main.c int main(int argc, char *argv[]) { .... cgi_sapi_module- ...
- nginx+php整合(是让nginx可以运行php,以及下载地址)
下载地址: nginx:http://nginx.org/en/download.html PHP: https://windows.php.net/download/ 都是官网的自己选择版本 安装文 ...
- PAT (Basic Level) Practice 1040 有几个PAT
个人练习 字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位( ...
- POJ:3273-Monthly Expense
Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 32067 Accepted: 12081 Des ...
- mysql学习第二天函数
-- 1.绝对值 select abs(-1)from dual -- 2.求平方根select sqrt(6)from dual -- 3.圆周率select pi()from dual -- 4. ...
- 4,远程连接Linux
为什么要远程连接Linux 在实际的工作场景中,虚拟机界面或者物理服务器本地的终端都是很少接触的,因为服务器装完系统之后,都要拉倒IDC机房托管,如果是购买的云主机,那更碰不到服务器本体了,只能通过远 ...
- 初学JS——实现基于计时器的小游戏。
这几天一直在看网易云课堂上免费的JS课程,正好今天看到讲了计时器setInterval,第一感觉就是像C#里的TIMER.然后课程里举得例子正好通过计时器改变新生成窗口的位置, 然后就突然有了灵感!可 ...
- 关于JavaScript设计模式的学习(二)
第二部分来了,是关于结构型的,同样的,还是在简书中,GitHub上也有代码示例和详细注释 简书:http://www.jianshu.com/p/face1be4b846 github:https:/ ...