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 [国家集训队]等差子序列的更多相关文章

  1. luogu P2757 [国家集训队]等差子序列

    题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...

  2. 洛谷 P2757 [国家集训队]等差子序列 解题报告

    P2757 [国家集训队]等差子序列 题目描述 给一个\(1\)到\(N\)的排列\(\{A_i\}\),询问是否存在 \[1 \le p_1<p_2<p_3<p_4<p_5& ...

  3. 1893. [国家集训队2011]等差子序列(bitset)

    ★★   输入文件:nt2011_sequence.in   输出文件:nt2011_sequence.out   简单对比时间限制:0.3 s   内存限制:512 MB [试题来源] 2011中国 ...

  4. [国家集训队2012]middle

    http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...

  5. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  8. [转] ACM中国国家集训队论文集目录(1999-2009)

    国家集训队1999论文集 陈宏:<数据结构的选择与算法效率——从IOI98试题PICTURE谈起>来煜坤:<把握本质,灵活运用——动态规划的深入探讨>齐鑫:<搜索方法中的 ...

  9. BZOJ 2124: 等差子序列

    Sol 线段树+Hash. 首先暴力 等差子序列至少3项就可以了,就枚举中项,枚举公差就可以了,只需要一个数在中项前出现,另一个数在中项前没出现过就可以了.复杂度 \(O(n^2)\) 然后我想了一个 ...

随机推荐

  1. 001 java简介

    JavaSE(Java Standard Edition):标准版本,定位在个人计算机上的应用.(失败) JavaEE(Java Enterprise Edition):企业版,定位在服务器端的应用. ...

  2. python+ffmpeg切割视频

    什么是ffmpeg 1.1 简介 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包 ...

  3. 【BZOJ4001】[TJOI2015]概率论(生成函数)

    [BZOJ4001][TJOI2015]概率论(生成函数) 题面 BZOJ 洛谷 题解 这题好仙啊.... 设\(g_n\)表示\(n\)个点的二叉树个数,\(f_n\)表示\(n\)个点的二叉树的叶 ...

  4. v-for 循环element-ui菜单

    vue 使用了element-ui的菜单组件, 这个组件的el-menu-item项上,有一个属性index,值是字符串类型, 在使用v-for的index时,它是一个数值型,所以如果直接写index ...

  5. <Android基础> (六) 数据存储 Part 3 SQLite数据库存储

    6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...

  6. mysq建表参数设置

    建表的完整性约束: not null 与 default unique primary auto_increment foreign key 外键的变种  三种关系 一.介绍 约束条件与数据类型的宽度 ...

  7. volatile&synchronized&diff

    1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点,那就是两大核心:JMM抽象内存模型以及happens-before规则(在这篇文章中已经经过了),三条性质:原子性,有序性和可见性. ...

  8. 深入剖析Kubernetes学习笔记:容器基础(05-06)

    05 :从进程说起 1.容器本身没有价值,有价值的是"容器编排" 2.什么是进程? 一旦"程序"被执行起来,它就从磁盘上的二进制文件,变成 1.计算机内存中的数 ...

  9. Python 条件、循环、异常处理

    一.条件语句 1.布尔值 条件语句中,判断条件的值一般是布尔值.即条件为真时,将执行什么,条件为假时,将执行什么. 下面的值在作为布尔表达式的时候,会被解释器看做假(false): False    ...

  10. CentOS 7 安装docker (图文)

     一定要用root账号登录系统,打开终端/或远程工具(如xshell)登录系统 检查是否已经安装命令  rpm –qa|grep docker 出现如上说明已安装 也可用命令docker -v  (如 ...