$ \Rightarrow $ 戳我进BZOJ原题

等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB  

Description

给一个 $ 1 $ 到 $ N $ 的排列 $ (A_i) $ ,询问是否存在 $ 1 \le p_1<p_2<p_3<p_4<p_5<…<p_ \le N (Len \ge 3) $ , 使得 $ A_,A_,A_,…A_{p_}是一个等差序列。  

Input

输入的第一行包含一个整数 $ T $ ,表示组数。 接下来 $ T $ 组数据,每组第一行一个整数 $ N $ ,每组第二行为一个 $ 1 $ 到 $ N $ 的排列,数字两两之间用空格隔开。 $ N \le 10000,T \le 7 $  

Output

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

Sample Input

 231 3 233 2 1

###Sample Output

 NY

 

思路

  • 题目是要找 $ i<j<k $ ,使得 $ A_j - A_i = A_k - A_j $ ;

  • 我们考虑按顺序插入 $ (A_i) $ ,对于我们当前位置 $ j $ ,如果有一个 $ A_i $ 已经出现了, 但是 $ A_k $ 还没有出现,因为是排列,所以这个 $ A_k $ 必然在后面,所以答案为“Y”;

  • 我们用一个辅助数组 $ (B_i) $ ,按顺序如果 $ x $ 出现了,就标记为 $ 1 $ , 那么如果一个数 $ x $ 满足条件,那么必然有 $ B_ != B_{x+y} $ , 那么只需要判断以 $ x $ 为中心的最长的字符串是否为回文串即可;

  • 因为如果不是回文串那么必然能找到一个 $ B_ != B_{x+y} $ ,所以答案为“Y”, 判断回文串可以用正反两边 $ hash $ ,然后 $ hash $ 值要动态修改,所以用树状数组和线段树都可以;  

代码

/**************************************************************Problem: 2124User: PotremZLanguage: C++Result: AcceptedTime:2480 msMemory:2072 kb
****************************************************************/#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
#define Mod 1000000007
#define N 10005
inline int read() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;
}
int T,n,a[N],hash1[N<<2],hash2[N<<2],pows[N];
inline void pushup(int o,int len){int mid=len>>1;hash1[o]=(hash1[o<<1]*pows[mid]%Mod+hash1[o<<1|1])%Mod;hash2[o]=(hash2[o<<1]+hash2[o<<1|1]*pows[len-mid]%Mod)%Mod;
}
void updata(int o,int l,int r,int pos){if(l==r){hash1[o]=hash2[o]=1;return;}int mid=l+r>>1;if(pos<=mid) updata(o<<1,l,mid,pos);else updata(o<<1|1,mid+1,r,pos);pushup(o,r-l+1);
}
int query1(int o,int l,int r,int L,int R){if(L>R) return 0;if(L==l&&r==R) return hash1[o];int mid=l+r>>1;if(L>mid) return query1(o<<1|1,mid+1,r,L,R);else if(R<=mid) return query1(o<<1,l,mid,L,R);else return (query1(o<<1,l,mid,L,mid)*pows[R-mid]%Mod+query1(o<<1|1,mid+1,r,mid+1,R))%Mod;
}
int query2(int o,int l,int r,int L,int R){if(L>R) return 0;if(L==l&&r==R) return hash2[o];int mid=l+r>>1;if(L>mid) return query2(o<<1|1,mid+1,r,L,R);else if(R<=mid) return query2(o<<1,l,mid,L,R);else return (query2(o<<1,l,mid,L,mid)+query2(o<<1|1,mid+1,r,mid+1,R)*pows[mid-L+1]%Mod)%Mod;
}
signed main(){T=read(); pows[0]=1;for(int i=1;i<N;++i) pows[i]=(pows[i-1]<<1)%Mod;while(T--){n=read(); bool f=0;memset(hash1,0,sizeof(hash1));memset(hash2,0,sizeof(hash2));for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<=n;++i){int len=min(n-a[i],a[i]-1);if(query1(1,1,n,a[i]-len,a[i]-1)!=query2(1,1,n,a[i]+1,a[i]+len)){ puts("Y"); break;}updata(1,1,n,a[i]);if(i==n) puts("N");}}return 0;
}

转载于:https://www.cnblogs.com/PotremZ/p/9662973.html

BZOJ 2124 等差子序列 线段树维护哈希相关推荐

  1. Caesar Cipher(线段树维护哈希)

    题目链接 解题思路: 1.和普通线段树维护哈希不同的是,这里要求原数组对一个数模mod,观察发现区间一次只加1,线段树记录区间最大值,在查询时如果区间的最大值大于等于mod,重建这部分线段树. 2.其 ...

  2. 线段树维护(最大区间和,最大子段和,最长连续上升子序列)

    本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. [动态dp]线段树维护转移矩阵

    背景:czy上课讲了新知识,从未见到过,总结一下. 所谓动态dp,是在动态规划的基础上,需要维护一些修改操作的算法. 这类题目分为如下三个步骤:(都是对于常系数齐次递推问题) 1先不考虑修改,不考虑区 ...

  5. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

  6. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  7. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  8. [SDOI2011]染色 (线段树维护子段问题+树剖)

    题意: 给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种: 1.将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c. 2.询问节点 a 到节点 b 的路径上的颜色段 ...

  9. Can you answer these queries III (线段树维护最大子段和)

    题意: 求一个区间的最大连续和. 0:表示把A[x]改成y 1:表示求[x,y]这个区间的最大连续和. 题解: 线段树维护四个变量. 倒着讲,先来看如何维护这四个变量. summax代表这个区间连续最 ...

最新文章

  1. 一个JDK线程池BUG引发的GC机制思考
  2. 兼容低版本迅雷的js调用
  3. 文献记录(part47)--KU-HAR: An open dataset for heterogeneous human activity recognition
  4. 查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云...
  5. esb 和 开源esb_如果今天完成,ESB会是什么样子?
  6. EasyMock 常见异常
  7. 吴恩达机器学习作业3.2神经网络
  8. java中aop和aoc的区别_AOC与AOP的区别
  9. zoom下载官网android最新,Zoom手机版app下载安装包-Zoom手机版安卓软件下载v5.0-后壳下载...
  10. linux 传真 邮件,基于Linux的传真系统(转)
  11. 关于需求确认的重要性
  12. 量子计算进阶:量子计算机的组建和量子计算原理(包含相关论文推荐60篇)
  13. 中国矿业大学(北京)第二届ACM程序设计公开赛(决赛)
  14. 软件工程面向对象分析
  15. 项目一众筹网01_00_项目简介_此项目是SSM过渡到分布式项目(SpringBoot、SpringCloud)、互联网的发展引领了技术的发展、瀑布模型、敏捷开发是什么意思
  16. 计算机中丢失msvcp140.dll无法启动此程序怎么办(修复教程)
  17. Angularjs兼容低版本IE
  18. SVM 美国威斯康星州乳腺癌检测
  19. Lumaqq移植到Android-登录篇
  20. 【NAS】神经架构搜索概述

热门文章

  1. clickhouse 增量更新_ClickHouse王炸功能即将来袭?
  2. CListCtrl::InsertColumn()和InsertItem()和SetItemText()
  3. java ognl表达式_java -------ognl表达式入门
  4. 基于深度学习模型的花卉图像分类代码_华为不止有鸿蒙!教你快速入门华为免编程深度学习神器ModelArts...
  5. 图数据库_ONgDB图数据库与Spark的集成
  6. hdfs复制文件夹_HDFS常用命令
  7. 十三、Vuex学习笔记
  8. python安装scipy出现红字_windows下安装numpy,scipy遇到的问题总结
  9. java使用原生语句操作mongo_Java 中 MongoDB 使用指南
  10. ubuntu定时执行python脚本方法及实例代码