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序列. 我们扫描整个序列.对于每一个正 ...
随机推荐
- hibernate09--连接查询
创建实体类 package cn.bdqn.bean; import java.util.ArrayList; import java.util.Date; import java.util.List ...
- HTML <script> 标签的 defer 和 async 属性
HTMKL <script>标签中有defer和async属性,简单介绍一下两者的区别吧. 普通的script标签会让浏览器立即下载并执行完毕,执行也是按照先后顺序,再进行后面的解析. ...
- vector排序
// VectorSort.cpp : Defines the entry point for the console application. // #include "stdafx.h& ...
- 个人小爱好:Operating System: three easy pieces—第6章第3小节问题2#进程间的切换
问题2#:进程间的切换 直接执行的下一个问题是如何实现进程的切换.进程的切换按理说是挺简单的,对吧?不就是决定哪一个进程应该停止,哪一进程应该开始而已,才多大点事情啊?但,事实上这还真的有点棘手:尤其 ...
- 通过Navicat远程连接MySQL
参考: http://blog.csdn.net/apple9005/article/details/53033148 问题一:在主机下通过Navicat连接服务器MySql的时候,提示“2003 C ...
- [httpd] httpd server 在低负载的情况下对SYN无响应
如题: 两台client通过load balance访问httpd server.两个client交互访问.load balance处于fullnat模式. server在低负载情况下,常常对某一个c ...
- 图像分类(二)GoogLenet Inception_v2:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Inception V2网络中的代表是加入了BN(Batch Normalization)层,并且使用 2个 3*3卷积替代 1个5*5卷积的改进版,如下图所示: 其特点如下: 学习VGG用2个 3* ...
- 11.c#类的成员初始化顺序
转自http://www.cnblogs.com/siceblue/archive/2009/01/15/1376430.html C#作为一种纯面向对象的话言,为它编写的整个代码里面到处都离不开对象 ...
- Oracle 25用户的权限管理
理解什么是权限 权限指的是执行特定命令或访问数据库对象的权利. 理解权限的作用 (保证)数据库安全性:系统安全性,数据安全性 了解权限的分类 系统权限: 允许用户执行特定的数据库操作,如创建表.创建索 ...
- python_json序列化和反序列化
序列化 import json dic = {'} print(json.dumps(dic)) 反序列化;json.loads() dic = {'} print(json.dumps(dic)) ...