BZOJ2124:等差子序列(线段树,hash)
Description
Input
Output
Sample Input
3
1 3 2
3
3 2 1
Sample Output
N
Y
Solution
发现只用求是否存在长度为$3$的等差子序列就够了。
对于一个$a_i$,若$a_i-k$和$a_i+k$都在他前面出现才不会有$(a_i-k,a_i,a_i+k)$这个等差子序列出现。
所以可以从前往后枚举,出现为$1$未出现为$0$。可以用线段树维护区间$hash$判断以$a_i$为中心是否回文。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define N (10009)
#define LL unsigned long long
using namespace std; int T,n,flag,a[N];
LL Segt[N<<][],base[N]; inline int read()
{
int x=,w=; char c=getchar();
while (c<'' || c>'') {if (c=='-') w=-; c=getchar();}
while (c>='' && c<='') x=x*+c-'', c=getchar();
return x*w;
} void Update(int now,int l,int r,int x)
{
if (l==r) {Segt[now][]=Segt[now][]=; return;}
int mid=(l+r)>>;
if (x<=mid) Update(now<<,l,mid,x);
else Update(now<<|,mid+,r,x);
Segt[now][]=Segt[now<<][]*base[r-mid]+Segt[now<<|][];
Segt[now][]=Segt[now<<|][]*base[mid-l+]+Segt[now<<][];
} LL Query(int now,int l,int r,int l1,int r1,int d)
{
if (l1<=l && r<=r1) return Segt[now][d];
int mid=(l+r)>>;
if (r1<=mid) return Query(now<<,l,mid,l1,r1,d);
else if (l1>mid) return Query(now<<|,mid+,r,l1,r1,d);
else if(d==) return Query(now<<,l,mid,l1,mid,d)*base[r1-mid]+Query(now<<|,mid+,r,mid+,r1,d);
else if(d==) return Query(now<<|,mid+,r,mid+,r1,d)*base[mid-l1+]+Query(now<<,l,mid,l1,mid,d);
} void Solve(int x)
{
Update(,,n,x);
if (x== || x==n) return;
int L=min(x-,n-x);
LL lh=Query(,,n,x-L,x-,);
LL rh=Query(,,n,x+,x+L,);
if (lh!=rh) flag=;
} int main()
{
T=read();
base[]=;
for (int i=; i<=; ++i) base[i]=base[i-]*;
while (T--)
{
memset(Segt,,sizeof(Segt));
n=read(); flag=;
for (int i=; i<=n; ++i)
{
int x=read();
if (!flag) Solve(x);
}
puts(flag?"Y":"N");
}
}
BZOJ2124:等差子序列(线段树,hash)的更多相关文章
- bzoj2124: 等差子序列线段树+hash
bzoj2124: 等差子序列线段树+hash 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2124 思路 找大于3的等差数列其实就是找等于 ...
- BZOJ 2124等差子序列 线段树&&hash
[题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...
- CF452F等差子序列 & 线段树+hash查询区间是否为回文串
记录一下一个新学的线段树基础trick(真就小学生trick呗) 给你一个1到n的排列,你需要判断该排列内部是否存在一个3个元素的子序列(可以不连续),使得这个子序列是等差序列.\(n\) <= ...
- [bzoj2124]等差子序列——线段树+字符串哈希
题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...
- bzoj 2124 等差子序列 (线段树维护hash)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1922 Solved: 714[Submit][Status][Discuss ...
- BZOJ 2124: 等差子序列 线段树维护hash
2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...
- BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 2354 Solved: 826[Submit][Status][Discuss ...
- BZOJ2124 等差子序列(树状数组+哈希)
容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...
- bzoj2124 等差子序列(树状数组+hash)
题意 给你一个1~n排列,问有没有一个等差数列(长度至少为3) 题解 我居然自己想到了正解. 但我最后写挂了,所以我又看了题解. 我们维护了一个以权值为下标的01序列. 我们扫描整个序列.对于每一个正 ...
随机推荐
- Flask 系列之 FlaskForm
通过使用 FlaskForm ,可以方便快捷的实现表单处理. 说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 ...
- 学会JavaScript函数式编程(第1部分)
摘要: JS函数式编程入门. 原文:学会使用函数式编程的程序员(第1部分) 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 在这篇由多部分组成的文章中,接下来将介绍函数式编程的一些概念 ...
- HDU6187(对偶图生成树)
Destroy Walls Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)T ...
- 洛谷P2503 [HAOI2006]均分数据(模拟退火)
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- Win7录制电脑屏幕视频
在日常生活中,有时候我们需要在电脑上录制视频,那就需要找到一款合适的录像工具,选择迅捷屏幕录像工具就是一个不错的选择,操作简单轻松易上手,美轮美奂的无损画质,教学视频.电影.游戏等都可以进行录制哦! ...
- 我写的Java相关的文章
此文正在更新中... Activiti 升级到Activiti7了. Web service/Soap Java如何调用.net写的asmx服务
- 使用Nginx实现服务器反向代理和负载均衡
前言 同事总问我Nginx做反向代理负载均衡的问题,因此特意留下一篇扫盲贴! 直接部署服务器的风险 假设,我开发了一个网站,然后买了一台Web服务器和一台数据库服务器,直接部署到公共网络上.如下图,网 ...
- css 布局之定位 相对/绝对/成比例缩放
给body添加 overflow: hidden; 可以将页面所有的 滚动条隐藏,但必须要给body 设置一个高度 overflow: hidden; height:864px; 父元素必须要设置 p ...
- mysql练习----Self join
stops(id, name) route(num,company,pos, stop) stops route id num name company pos stop
- XSS攻击介绍
一.概念 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞, ...