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的更多相关文章

  1. BZOJ2124:等差子序列(线段树,hash)

    Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N (Len>=3), 使得A ...

  2. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  3. CF452F等差子序列 & 线段树+hash查询区间是否为回文串

    记录一下一个新学的线段树基础trick(真就小学生trick呗) 给你一个1到n的排列,你需要判断该排列内部是否存在一个3个元素的子序列(可以不连续),使得这个子序列是等差序列.\(n\) <= ...

  4. [bzoj2124]等差子序列——线段树+字符串哈希

    题目大意 给一个1到N的排列\(A_i\),询问是否存在\(p_i\),\(i>=3\),使得\(A_{p_1}, A_{p_2}, ... ,A_{p_len}\)是一个等差序列. 题解 显然 ...

  5. bzoj 2124 等差子序列 (线段树维护hash)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1922  Solved: 714[Submit][Status][Discuss ...

  6. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...

  7. BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 2354  Solved: 826[Submit][Status][Discuss ...

  8. BZOJ2124 等差子序列(树状数组+哈希)

    容易想到一种暴力的做法:枚举中间的位置,设该位置权值为x,如果其两边存在权值关于x对称即合法. 问题是如何快速寻找这个东西是否存在.考虑仅将该位置左边出现的权值标1.那么若在值域上若关于x对称的两权值 ...

  9. bzoj2124 等差子序列(树状数组+hash)

    题意 给你一个1~n排列,问有没有一个等差数列(长度至少为3) 题解 我居然自己想到了正解. 但我最后写挂了,所以我又看了题解. 我们维护了一个以权值为下标的01序列. 我们扫描整个序列.对于每一个正 ...

随机推荐

  1. xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun

    原文地址 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcru ...

  2. 【MySQL】锁——查看当前数据库锁请求的三种方法 20

    MySQL提供了查看当前数据库锁请求的三种方法:1. show  full  processlist命令  观察state和info列 2. show engine  innodb status\G ...

  3. [Luogu P1886]滑动窗口--单调队列入门

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  4. .NET Core开发日志——OData

    简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...

  5. Codeforces 677 - A/B/C/D/E - (Undone)

    链接: A - Vanya and Fence - [水] AC代码: #include<bits/stdc++.h> using namespace std; ; int n,h; in ...

  6. delphi操作sqlite3

    Delphi SQLite 简明无废话上手指南SQLite下载http://www.sqlite.org/download.html SQLite FAQhttp://www.sqlitecn.org ...

  7. Oracle启动关闭

    启动: [oracle@oracleSigle ~]$ sqlplus / as sysdba   SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov ...

  8. freeswitch的拨号规则配置

    当一个呼叫在ROUTING状态下达到命中拨号规则解析器时,相应的拨号规则就开始解析了.随着解析的进行,在xml文件中的符合条件的或标签中的指令形成一个指令表,安装到这个通道中. 你可以将拨号规则文件放 ...

  9. Jenkins Pipeline脚本

    node { echo 'Hello World' } node 在Jenkins环境中分配一个执行器和工作空间. echo 在控制台输出中写入简单的字符串 try { timeout(time: 1 ...

  10. 如何用VSCode手动编译Ace Editor

    对于习惯微软VS的用户,可能很不习惯开源社区兴起的前端开发流程.随着NodeJs的兴起,JavaScript已经成为Github上开源项目最多的语言.使用微软提供的VSCode可以很好地利用这些开源项 ...