bzoj2124: 等差子序列线段树+hash
bzoj2124: 等差子序列线段树+hash
链接
https://www.lydsy.com/JudgeOnline/problem.php?id=2124
思路
找大于3的等差数列其实就是找等于三的等差数列
三个等差数列的话,枚举中间点。
如果有对称点(a[i]-j,a[i]+j)在两侧,那么就能构成一个等差数列
我们可以转化为权值数组中a[i]能到达的最远对称串是否是回文串。
马拉车??不不。hash是万能的。
这里hash可以用线段树维护
错误
我太菜了,代码写的特恶心
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#define ull unsigned long long
using namespace std;
const int N=2e5+7;
const int mod=233;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,pos[N],a[N];
ull my_pow[N];
namespace BIT {
int lowbit(int x) {return x&-x;}
ull sum[2][N];
void add(int id) {
for(int i=id;i<=n;i+=lowbit(i))
sum[0][i]+=my_pow[id];
for(int i=n-id+1;i<=n;i+=lowbit(i))
sum[1][i]+=my_pow[n-id+1];
}
ull QQ0(int x,int y) {
ull ans=0;
if(x-1) for(int i=x-1;i>=1;i-=lowbit(i)) ans-=sum[0][i];
for(int i=y;i>=1;i-=lowbit(i)) ans+=sum[0][i];
return ans;
}
ull QQ1(int x,int y) {
ull ans=0;
if(x-1) for(int i=x-1;i>=1;i-=lowbit(i)) ans-=sum[1][i];
for(int i=y;i>=1;i-=lowbit(i)) ans+=sum[1][i];
return ans;
}
}
// bool dsr[N];
int main() {
// freopen("1.in","r",stdin);
int T=read();
my_pow[1]=1;
for(int i=2;i<=10000;++i) my_pow[i]=my_pow[i-1]*233;
while(T--) {
memset(BIT::sum,0,sizeof(BIT::sum));
n=read();
for(int i=1;i<=n;++i) a[i]=read();
bool flag=false;
for(int i=1;i<=n;++i) {
int len=min(a[i]-1,n-a[i]);
// for(int k=1;k<=n;++k) cout<<dsr[k]<<" <";puts("");
// cout<<a[i]-len<<" "<<a[i]<<" vs "<<a[i]<<" "<<a[i]+len<<" <len\n";
int x=a[i]-len,y=a[i];
int y_=n-a[i]+1,x_=n-(a[i]+len)+1;
int tmp0=1,tmp1=1;
// cout<<x<<" "<<y<<" vs "<<x_<<" "<<y_<<"\n";
if(x>x_) tmp1+=x-x_;
else tmp0+=x_-x;
// cout<<tmp0<<" "<<tmp1<<"\n";
if(BIT::QQ0(x,y)*my_pow[tmp0]!=BIT::QQ1(x_,y_)*my_pow[tmp1]) {
puts("Y");
// cout<<i<<" "<<a[i]<<"\n";
flag=true;
break;
}
BIT::add(a[i]);
// dsr[a[i]]=1;
}
if(!flag) puts("N");
}
return 0;
}
bzoj2124: 等差子序列线段树+hash的更多相关文章
- BZOJ2124:等差子序列(线段树,hash)
Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得A ...
- 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序列. 我们扫描整个序列.对于每一个正 ...
随机推荐
- poj 1228
就是给你一堆点,看这些点能否构成一个 稳定的凸包. 凸包每条边上有3个及以上的点就可以了. #include <cstdio> #include <cstring> #incl ...
- Nestjs 链接mysql
文档 下插件 λ yarn add @nestjs/typeorm typeorm mysql 创建 cats模块, 控制器,service λ nest g mo cats λ nest g co ...
- Logcat
logcat -- "-s"选项 : 设置输出日志的标签, 只显示该标签的日志; -- "-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参 ...
- 2018今日头条杯 E-Jump a Jump
Problem E. Jump A JumpInput file: standard inputOutput file: standard outputTime limit: 1 secondsMemor ...
- 苏宁基于Spark Streaming的实时日志分析系统实践 Spark Streaming 在数据平台日志解析功能的应用
https://mp.weixin.qq.com/s/KPTM02-ICt72_7ZdRZIHBA 苏宁基于Spark Streaming的实时日志分析系统实践 原创: AI+落地实践 AI前线 20 ...
- AngularJS实现可伸缩的页面切换
AngularJS实现可伸缩的页面切换 AngularJS 1.2 通过引入基于纯CSS class的切换和动画,在一个单页面应用创建页面到页面的切换变得更加的容易.只需要使用一个ng-view,让我 ...
- 对象何时进入老年代、何时发生full gc
一.对象何时进入老年代 (1)当对象首次创建时, 会放在新生代的eden区, 若没有GC的介入,会一直在eden区, GC后,是可能进入survivor区或者年老代 (2)当对象年龄达到一定的大小 , ...
- Python3学习之路~5.10 PyYAML模块
Python也可以很容易的处理ymal文档格式,只不过需要安装一个模块,参考文档:http://pyyaml.org/wiki/PyYAMLDocumentation
- [sql]sql的select字符串切割
可以经常看看 mysql的refman,写的很棒 sql基础操作 查看表结构 show create table desc table show full columns from test1; li ...
- 41A
#include <stdio.h> #include <string.h> #define MAXSIZE 105 int main() { char Berlandish[ ...