P2757 [国家集训队]等差子序列
P2757 [国家集训队]等差子序列
推荐一篇好题解
此题要求我们在一个序列中找出一个等差子序列。
显然,我们只需要考虑子序列长度len=3的情况,因为在长度为4的子序列中必定有一个长度为3的子序列。
问题就变成了:在序列找到三个数,满足a[j]-a[i]=a[k]-a[j]且i<j<k
移项,a[i]+a[k]=2 × a[j]
O(\(n^2\))的做法肯定是十分好想的。
枚举j和a[i],查看vis[a[k]]是否为true即可。
这时观察数据,发现a[i]∈[1,n],所以这时我们想到用hash来记录a[i]是否在之前出现过。
并且用线段树动态维护hash值(听说可以用树状数组,但是没写出来)
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=200005;
ll read(){
ll x=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x;
}
const ll mo=19280817;
ll hash1[N<<2],hash2[N<<2];
ll n,pw[N];
void up(ll root,ll l,ll r,ll x){
if(l==r&&l==x){hash1[root]=hash2[root]=1;return;}
if(l>x||r<x)return;
ll mid=l+r>>1;
up(root<<1,l,mid,x);
up(root<<1|1,mid+1,r,x);
hash1[root]=(hash1[root<<1]*pw[r-mid]%mo+hash1[root<<1|1])%mo;
hash2[root]=(hash2[root<<1]%mo+hash2[root<<1|1]*pw[mid-l+1])%mo;
}
ll Q1(ll root,ll l,ll r,ll beg,ll end){
if(l>end||r<beg)return 0;
if(l>=beg&&r<=end)return hash1[root];
ll mid=l+r>>1,ans=0;
if(mid<beg)return Q1(root<<1|1,mid+1,r,beg,end);
if(mid+1>end)return Q1(root<<1,l,mid,beg,end);
ans=Q1(root<<1,l,mid,beg,end)*pw[min(end,r)-mid]%mo;
ans=(ans+Q1(root<<1|1,mid+1,r,beg,end))%mo;
return ans;
}
ll Q2(ll root,ll l,ll r,ll beg,ll end){
if(l>end||r<beg)return 0;
if(l>=beg&&r<=end)return hash2[root];
ll mid=l+r>>1,ans=0;
if(mid<beg)return Q2(root<<1|1,mid+1,r,beg,end);
if(mid+1>end)return Q2(root<<1,l,mid,beg,end);
ans=Q2(root<<1|1,mid+1,r,beg,end)*pw[mid-max(beg,l)+1]%mo;
ans=(ans+Q2(root<<1,l,mid,beg,end))%mo;
return ans;
}
int main(){
int T=read();pw[0]=1;for(ll i=1;i<=10000;++i)pw[i]=(pw[i-1]*2)%mo;
while(T--){
memset(hash1,0,sizeof(hash1));
memset(hash2,0,sizeof(hash2));
n=read();bool flag=1;
for(ll i=1;i<=n;++i){
ll x=read();
if(!flag)continue;
ll len=min(x-1,n-x);
if((Q1(1,1,n,x-len,x-1)+mo)%mo!=(Q2(1,1,n,x+1,x+len)+mo)%mo){flag=0;continue;}
up(1,1,n,x);
}
if(flag)puts("N");else puts("Y");
}
return 0;
}
P2757 [国家集训队]等差子序列的更多相关文章
- luogu P2757 [国家集训队]等差子序列
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...
- 洛谷 P2757 [国家集训队]等差子序列 解题报告
P2757 [国家集训队]等差子序列 题目描述 给一个\(1\)到\(N\)的排列\(\{A_i\}\),询问是否存在 \[1 \le p_1<p_2<p_3<p_4<p_5& ...
- 1893. [国家集训队2011]等差子序列(bitset)
★★ 输入文件:nt2011_sequence.in 输出文件:nt2011_sequence.out 简单对比时间限制:0.3 s 内存限制:512 MB [试题来源] 2011中国 ...
- [国家集训队2012]middle
http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...
- BZOJ 2039: [2009国家集训队]employ人员雇佣
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1369 Solved: 667[Submit ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7676 Solved: 3509[Subm ...
- [转] ACM中国国家集训队论文集目录(1999-2009)
国家集训队1999论文集 陈宏:<数据结构的选择与算法效率——从IOI98试题PICTURE谈起>来煜坤:<把握本质,灵活运用——动态规划的深入探讨>齐鑫:<搜索方法中的 ...
- BZOJ 2124: 等差子序列
Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...
随机推荐
- servlet(6) 链接数据库
一.servlet链接mysql步骤: 1.注册驱动器:Class.forName("com.mysql.jdbc.Driver"); 加载类并执行下面的静态语句块,将Driver ...
- C# AddRange为数组添加多个元素的代码
将代码过程中重要的代码片段做个收藏,下面代码段是关于C# AddRange为数组添加多个元素的代码,希望对小伙伴有所用处.ArrayList ab = new ArrayList();ab.Add(& ...
- Spring MVC 使用介绍(十六)数据验证 (三)分组、自定义、跨参数、其他
一.概述 除了依赖注入.方法参数,Bean Validation 1.1定义的功能还包括: 1.分组验证 2.自定义验证规则 3.类级别验证 4.跨参数验证 5.组合多个验证注解 6.其他 二.分组验 ...
- Scrum【转】
转载自:https://www.cnblogs.com/l2rf/p/5783726.html 灵感来自于一段冷笑话: 一天,一头猪和一只鸡在路上散步,鸡看了一下猪说,“嗨,我们合伙开一家餐馆怎么样? ...
- table的 noWrap 属性不换行
nowrap是什么意思? HTML中td元素的nowrap属性表示禁止单元格中的文字自动换行. 但使用时要注意的是,td元素noWrap属性的行为与td元素的width属性有关. td元素中nowra ...
- Transformer【Attention is all you need】
前言 Transfomer是一种encoder-decoder模型,在机器翻译领域主要就是通过encoder-decoder即seq2seq,将源语言(x1, x2 ... xn) 通过编码,再解码的 ...
- atool-build 打包项目报JavaScript heap out of memory 错误
出现这个问题的原因,是因为NodeJS给JavaScript设置了默认内存使用限制(32位系统下0.7GB,64位系统下1.4GB),就算我们的电脑内存是64GB的,在使用atool-build打包时 ...
- Vue学习笔记二:v-cloak,v-text,v-html的使用
目录 v-cloak:解决插值表达式闪烁问题 安装插件Live Server 右键以HTTP形式运行HTML v-text:以属性方式使用插值表达式 v-cloak和v-text的区别 v-html: ...
- 值得一学的webpack4
初识webpack webpack是帮助我们管理复杂项目的工具. 学习webpack会极大扩充前端开发视野. webpack可以实现: Tree shaking 懒加载 代码分割 webpack4速度 ...
- PMP知识点(二)——三点估算的两种方法对活动持续时间估算的影响和如何取舍
一.准备工作 活动持续时间的估算属于PMBOK中第六章项目时间管理中第五节6.6估算活动持续时间的内容. 三点估算是6.5和7.2(估算成本)中应用到的一种工具和技术.数据流向图参考如下: 其应用到的 ...