牛客网NOIP赛前集训营-提高组(第四场)B区间

题目描述

给出一个序列$ a_1\ \ \dots\ \ a_n$。

定义一个区间 \([l,r]\) 是好的,当且仅当这个区间中存在一个 \(i\),使得 \(a_i\) 恰好等于 \(a_l, a_{l+1} \ \ \dots \ \ a_{r-1}, a_r\) 的最大公因数。

求最长的好的区间的长度。

输入描述:

第一行 n,表示序列的长度;
第二行 n 个数 a1,a2,...,an。

输出描述:

输出一行一个数,表示最长的好的区间的长度。

乱搞就行,考试的时候睡了一觉就想出来了

用\(f[i]\) 表示前面第一个能被\(a[i]\)整除的位置

用\(g[i]\) 表示后面第一个能被\(a[i]\)整除的位置

则可以递推

f[1]=1;
for(int i=2;i<=n;++i){
if(a[i]%a[f[i-1]]==0)f[i]=f[i-1];
else f[i]=i;
}
g[n]=n;
for(int i=n-1;i;--i){
if(a[i]%a[g[i+1]]==0)g[i]=g[i+1];
else g[i]=i;
}

最后在\(f\)和\(g\)里面连续的一段取最长的就行了

但是如果有这种数据:

5
10 6 6 6 9

我们写出\(f\)和\(g\):

f: 1 2 2 2 5
g: 1 4 4 4 5

发现有重复数字时位置会不一样

所以再用两个数组\(l[i]\)和\(r[i]\)乱搞一下

for(int i=1;i<=n;++i)
r[f[i]]=max(r[f[i]],i),
l[g[i]]=min(l[g[i]],i);
for(int i=1;i<=n;++i)
r[i]=max(r[i],r[f[i]]),
l[i]=min(l[i],l[g[i]]);
for(int i=1;i<=n;++i)ans=max(ans,r[i]-l[i]+1);

注意卡读入,用fread或者ios和tie优化都行

然后就没有然后了

可能我的思路比较别致

#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e6+5;
#define int long long
char getc(){
static char buf[maxn],*p1=buf,*p2=buf;
return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,maxn,stdin),p1==p2)? EOF:*p1++;
}
int mian(){
int s=0,f=1;char ch;
while(!isdigit(ch=getc()))(ch=='-')&&(f=-1);
for(s=ch-'0';isdigit(ch=getc());s=s*10+ch-'0');
return s*f;
}
int a[maxn],n,f[maxn],g[maxn],ans,l[maxn],r[maxn];
signed main(){
n=mian();
for(int i=1;i<=n;++i)a[i]=mian(),l[i]=r[i]=i;
f[1]=1;
for(int i=2;i<=n;++i){
if(a[i]%a[f[i-1]]==0)f[i]=f[i-1];
else f[i]=i;
}
g[n]=n;
for(int i=n-1;i;--i)
if(a[i]%a[g[i+1]]==0)g[i]=g[i+1];
else g[i]=i;
for(int i=1;i<=n;++i)
r[f[i]]=max(r[f[i]],i),
l[g[i]]=min(l[g[i]],i);
for(int i=1;i<=n;++i){
r[i]=max(r[i],r[f[i]]),
l[i]=min(l[i],l[g[i]]);
}
for(int i=1;i<=n;++i)ans=max(ans,r[i]-l[i]+1);
cout<<ans<<endl;
return 0;
}

让我们一起膜拜大佬@olinr

牛客网NOIP赛前集训营-提高组(第四场)B区间的更多相关文章

  1. 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告

    目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...

  2. 牛客网NOIP赛前集训营-提高组(第二场)A 方差

    链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中  表示序列的平 ...

  3. [牛客网NOIP赛前集训营-提高组(第一场)]C.保护

    链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...

  4. 牛客网NOIP赛前集训营-提高组(第一场)

    牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...

  5. 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场

    第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...

  6. 牛客网NOIP赛前集训营-提高组(第一场)B 数数字

    数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...

  7. 牛客网NOIP赛前集训营-提高组(第一场)A 中位数

    中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...

  8. 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游

    [题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...

  9. 牛客网NOIP赛前集训营-提高组(第四场)游记

    牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...

随机推荐

  1. C++继承后的函数访问权限

    今天在写代码时发现对继承后的函数访问权限不太清楚,于是自己做了个测试: 1.头文件(test.h) 1 #include <iostream>  2 using namespace std ...

  2. maven配置logback

    [背景] 刚接触大数据项目,在生产环境中经常需要使用日志来判定一些问题的原因. 一直以来都在使用System.out.println的标准输出来往控制台上打印日志.这种方法对性能影响很大不说,查看日志 ...

  3. css实现水平伸缩菜单

    ul li a{transition:width 500ms ease;} a:hover{width:*;} 高度向上延伸用height:*;margin-top:-*px;//负值实现向上

  4. Python - excel 详解

    安装 pip install xlrd        # 读xlspip install xlwt     # 写xlspip install xlutils     # 改写xls 读取 Excel ...

  5. java修饰符 protect public protected

    1.private修饰词,表示成员是私有的,只有自身可以访问: 2.protected,表示受保护权限,体现在继承,即子类可以访问父类受保护成员(子类是可以访问父类的带protected修饰符的成员的 ...

  6. ettercap 命令

    本地主机:192.168.0.149 目标主机:192.168.0.138 /etc/ettercap/etter.dns,将dns欺骗到本机 ettercap -T -q -i wlan0 -P d ...

  7. 大型Unity手游《英雄之刃-最后之战》源码分析

    英雄之刃之最后一战是国内首款原创精品MOBA手游,是一款由前暴雪文案亲自操刀世界观,日韩专业团队打造美术场景,新加坡团队精心制作战斗音乐的旷世之作! 超快速的匹配对战.默契的团队协作给你带来意犹未尽的 ...

  8. WCF服务编程 读书笔记——第2章 服务契约

    操作重载诸如 C++ 和 C# 等编程语言都支持方法重载,即允许具有相同名称的两个方法可以定义不同的参数.例如,如下的 C# 接口就是有效的定义: interface ICalculator { in ...

  9. javascript的caller,callee,call,apply[转]

    在提到上述的概念之前,首先想说说javascript中函数的隐含参数:arguments Arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[ ...

  10. myeclipse设置默认的jsp打开方式