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序列. 我们扫描整个序列.对于每一个正 ...
随机推荐
- string find_last_of 用法
int find_first_of(char c, int start = 0): 查找字符串中第1个出现的c,由位置start开始. 如果有匹配, ...
- elk-插件(head、X-pack)(五)
一.修改ES配置,允许REST跨源操作ES服务器,添加以下2个配置,并重启ES. http.cors.enabled: true #如果启用了 HTTP 端口,那么此属性会指定是否允许跨源 REST ...
- 一些关于SQL优化的总结
由于这个项目一直都是mysql所以写点mysql的 1.数据存储引擎的选择,MyISAM 和 InnoDB 的选择 InnoDB 一般都会选择这个,但是如果真的涉及到一些不涉及增删的表,可以考虑下My ...
- 关于Vue懒加载问题
有关Vue懒加载其实并不是想象的那么难和复杂: 首先引入 import VueLazyLoad from 'vue-lazyload'; 其次是使用 Vue.use(VueLazyLoad,{ er ...
- Java开发岗位面试题归类
一.Java基础 1. String类为什么是final的. ( 1.由于String类不能被继承,所以就不会被修改,这就避免了因为继承引起的安全隐患: 2.String类在程序中出现的频率比较高,如 ...
- PHP(数据类型、水仙花数(重点)运算符)
<!--三个弹窗 alert():打开页面只是提示一下,告警框 仅仅提示,关了就关了 confirm():选择框 有返回值 prompt():输入框 控制台输出console.log() 字符串 ...
- myEclipse导入现成项目出现错误 【申明来源于网络】
myEclipse导入现成项目出现错误 [申明来源于网络] 原地址:http://blog.sina.com.cn/s/blog_6d7703400100znh6.html file–>impo ...
- 2019年3月8日A股百点暴跌行情思考
本人操作: [海通证券]:早盘挂单并撤单,盘中高位卖出,尾盘低位接回. 总结 - 正确:持股数量不变,成本降低. [信雅达]:早盘低开加仓,盘中高位卖出,跌后接回,尾盘跌停. 总结 - 正确:加仓, ...
- Luogu 1583 - 魔法照片 - [简单排序题]
题目链接:https://www.luogu.org/problemnew/show/P1583 题目描述一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人. ...
- js--单选按钮赋值
var sex='${userInfo.sex}'; if(sex=="女"){ $("input[name=sex][value='女']").attr(&q ...