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*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 等差子序列相关推荐
- CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...
- 线段树专题-等差子序列 BZOJ-2124
线段树专题-等差子序列 感谢 感谢孙耀峰的线段树PPT,使我获益匪浅. 题目来源 BZOJ−2124BZOJ-2124BZOJ−2124 题意 给出长度为nnn的1−n1-n1−n的排列AAA 问是否 ...
- BZOJ 2124 等差子序列 线段树维护哈希
$ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...
- Bzoj2124(p5364): 等差子序列
题目描述 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<-<pLen<=N (Len>=3), 使得Ap1,Ap2, ...
- P2757 [国家集训队]等差子序列
P2757 [国家集训队]等差子序列 题目传送门 推荐一篇好题解 此题要求我们在一个序列中找出一个等差子序列. 显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为 ...
- 最长等差数列_最长等差子序列的长度
问题描述 给定一个整数数组 A,返回A 中最长等差子序列的长度. 输入:[20,1,15,3,10,5,8] 输出:4 解释:最长的等差子序列是 [20,15,10,5] 问题分析 我们要找出最长的等 ...
- Leecode 1218. 最长定差子序列——Leecode每日一题系列
今天是坚持每日一题打卡的第十天 题目链接:https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-differ ...
- 等差数列划分 II - 子序列(动态规划)
如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 9 7, 7, 7, 7 3, -1, -5, -9 以下数列不是 ...
- 1218. 最长定差子序列
文章目录 1 题目理解 2 开始思考 1 题目理解 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 diff ...
最新文章
- 最近想做个音乐共享的软件
- R in Action 读书笔记(5)
- freemarker 展示数据列表并传值给后台
- java设计模式---三种工厂模式
- linux系统中常见的目录,Linux系统中常见的目录名称以及相应内容
- 25条提高iOS App性能的建议和技巧
- tensorflow2.1学习--认识张量和常用函数一
- Security+ 学习笔记54 安全政策
- opencv python3 找图片不同_使用OpenCV和Python查找图片差异
- android:获取当前应用的版本
- mermaid流程图语法教程
- 取redis中手机验证码,并验证是否正确
- 学习树莓派的几个推荐站点
- 如何在Mac os X上搭建本地服务器环境
- nasm预处理器(1)
- Linux内核中的IPSEC实现2
- 电脑C盘满了怎么办?请放心删除这些文件夹
- python终端命令执行提示找不到自定义模块
- 华为私有云的搭建方案_网盘限速太坑爹,用它小白也能搭建私有云
- Word2vec浅显的理解
热门文章
- ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区
- 论文阅读:Spatial Transformer Networks
- 用Docker部署TensorFlow Serving服务
- 天池 在线编程 三等分(模拟)
- LeetCode 718. 最长重复子数组(DP)
- 朴素贝叶斯法(Naive Bayes,NB)
- LeetCode 860. 柠檬水找零(贪心)
- LeetCode 79. 单词搜索(回溯DFS)
- POJ 1007 DNA排序解题
- Codeforces Round #697 (Div. 3)A~G解题报告