http://codevs.cn/problem/1283/

题目描述 Description

给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap2,Ap3,…ApLen 是一个等差序列。

输入描述 Input Description

输入的第一行包含一个整数 T,表示组数。

下接 T 组数据,每组第一行一个整数 N,每组第二行为一个 1 到 N 的排列, 数字两两之间用空格隔开。

输出描述 Output Description

对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一 行“N”。

样例输入 Sample Input

2

3

1 3 2

3

3 2 1

样例输出 Sample Output

N

Y

数据范围及提示 Data Size & Hint

对于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*4],anti_hash[N*4],r1,r2;
struct TREE
{public:void up(int k,int l,int r){hash[k]=hash[k<<1]*bit[r-(l+r>>1)]+hash[k<<1|1];anti_hash[k]=anti_hash[k<<1|1]*bit[(l+r>>1)-l+1]+anti_hash[k<<1];}void change(int k,int l,int r,int pos){if(l==r) {anti_hash[k]=hash[k]=1;return;}int mid=l+r>>1;if(pos<=mid) change(k<<1,l,mid,pos);else change(k<<1|1,mid+1,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==1 ? hash[k]:anti_hash[k];int mid=l+r>>1;if(opr<=mid) return query(k<<1,l,mid,opl,opr,w);else if(opl>mid) return query(k<<1|1,mid+1,r,opl,opr,w);else if(w==1) return query(k<<1,l,mid,opl,mid,w)*bit[opr-mid]+query(k<<1|1,mid+1,r,mid+1,opr,w);else return query(k<<1|1,mid+1,r,mid+1,opr,w)*bit[mid-opl+1]+query(k<<1,l,mid,opl,mid,w);}void solve(int i){len=min(i-1,n-i);r1=query(1,1,n,i-len,i-1,1);r2=query(1,1,n,i+1,i+len,2);if(r1!=r2) ok=true;}
}tree;
int main()
{bit[1]=233; for(int i=2;i<N;i++) bit[i]=bit[i-1]*233;scanf("%d",&T);while(T--){memset(hash,0,sizeof(hash));memset(anti_hash,0,sizeof(anti_hash));scanf("%d",&n);ok=false;for(int i=1;i<=n;i++){scanf("%d",&x);if(!ok){tree.change(1,1,n,x);if(x!=1&&x!=n) tree.solve(x);}}if(ok) puts("Y");else puts("N");}
}

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/6813049.html

codevs 1283 等差子序列相关推荐

  1. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash

    传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...

  2. 线段树专题-等差子序列 BZOJ-2124

    线段树专题-等差子序列 感谢 感谢孙耀峰的线段树PPT,使我获益匪浅. 题目来源 BZOJ−2124BZOJ-2124BZOJ−2124 题意 给出长度为nnn的1−n1-n1−n的排列AAA 问是否 ...

  3. BZOJ 2124 等差子序列 线段树维护哈希

    $ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...

  4. Bzoj2124(p5364): 等差子序列

    题目描述 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<-<pLen<=N (Len>=3), 使得Ap1,Ap2, ...

  5. P2757 [国家集训队]等差子序列

    P2757 [国家集训队]等差子序列 题目传送门 推荐一篇好题解 此题要求我们在一个序列中找出一个等差子序列. 显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为 ...

  6. 最长等差数列_最长等差子序列的长度

    问题描述 给定一个整数数组 A,返回A 中最长等差子序列的长度. 输入:[20,1,15,3,10,5,8] 输出:4 解释:最长的等差子序列是 [20,15,10,5] 问题分析 我们要找出最长的等 ...

  7. Leecode 1218. 最长定差子序列——Leecode每日一题系列

    今天是坚持每日一题打卡的第十天 题目链接:https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-differ ...

  8. 等差数列划分 II - 子序列(动态规划)

    如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...

  9. 1218. 最长定差子序列

    文章目录 1 题目理解 2 开始思考 1 题目理解 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 diff ...

最新文章

  1. 最近想做个音乐共享的软件
  2. R in Action 读书笔记(5)
  3. freemarker 展示数据列表并传值给后台
  4. java设计模式---三种工厂模式
  5. linux系统中常见的目录,Linux系统中常见的目录名称以及相应内容
  6. 25条提高iOS App性能的建议和技巧
  7. tensorflow2.1学习--认识张量和常用函数一
  8. Security+ 学习笔记54 安全政策
  9. opencv python3 找图片不同_使用OpenCV和Python查找图片差异
  10. android:获取当前应用的版本
  11. mermaid流程图语法教程
  12. 取redis中手机验证码,并验证是否正确
  13. 学习树莓派的几个推荐站点
  14. 如何在Mac os X上搭建本地服务器环境
  15. nasm预处理器(1)
  16. Linux内核中的IPSEC实现2
  17. 电脑C盘满了怎么办?请放心删除这些文件夹
  18. python终端命令执行提示找不到自定义模块
  19. 华为私有云的搭建方案_网盘限速太坑爹,用它小白也能搭建私有云
  20. Word2vec浅显的理解

热门文章

  1. ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区
  2. 论文阅读:Spatial Transformer Networks
  3. 用Docker部署TensorFlow Serving服务
  4. 天池 在线编程 三等分(模拟)
  5. LeetCode 718. 最长重复子数组(DP)
  6. 朴素贝叶斯法(Naive Bayes,NB)
  7. LeetCode 860. 柠檬水找零(贪心)
  8. LeetCode 79. 单词搜索(回溯DFS)
  9. POJ 1007 DNA排序解题
  10. Codeforces Round #697 (Div. 3)A~G解题报告