等差子序列(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\)的等差子序列.可以枚举等差子 ...
随机推荐
- Redis连接工具类
Redis连接工具类 导包 测试一下(junit) package com.test; import org.junit.Test; import redis.clients.jedis.Jedis; ...
- Tinyhttpd 知识点
1. fork 子进程 #include <stdio.h> #include <unistd.h> int main(void) { pid_t pid; ; pid = f ...
- php红包算法函数[优化]
php红包算法 <?php header("Content-Type: text/html;charset=utf-8");//输出不乱码,你懂的 $total=10000; ...
- 【shopex】添加网页挂件widgets
一步步做个widgets 基础篇 首先建立一个目录plugins/widgets/helloword 这个就是新的挂件目录,系统的每个widgets都是一个目录 里面放两个文件: widgets.ph ...
- Redis 数据类型List链表
list类型是一个双向链表. 上进上出:栈 例1 lpush newlogin tom lpush newlogin jim lpush newlogin php lpush newlogin th ...
- 数据分析处理库Pandas——数据透视表
数据 按指定的行列值显示 求和 按行求和 按列求和 数据 求平均 备注:按性别计算每个等级船票的平均价格. 备注:每个等级船舱中每种性别获救的平均值,也就是获救的比例. 备注:每种性别未成年人获救的平 ...
- Python学习之编程基础
学习Python之前首先我们要了解Python是什么? question 1:Python是什么? answer:Python是一门编程语言.(什么是编程语言?) 语言:语言是不同个体之间沟通的介质. ...
- [USACO1.5] 回文质数
P1217 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 < ...
- java.lang.NoSuchMethodError: cn.makangning.test.dao.Users.getUserBirthday()Ljava/sql/Date;
有时候出现这种怪异的问题,是由于多个版本的class存在. 比如说:某个java编译成class后,放到classes下面,然后lib目录下,也有这个class所在的jar包,这样就导致classpa ...
- SharpCompress的压缩文件解压和文件夹压缩
1.前言 最近做一个功能需要用到对压缩文件的解压,就找到了这个SharpCompress不错,还能解压rar的文件.但是网上的资料和我拿到的SharpCompress.dll的方法有些出入,所以我就自 ...