牛客网NOIP赛前集训营-提高组(第四场)B区间
牛客网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区间的更多相关文章
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- 牛客网NOIP赛前集训营-提高组(第二场)A 方差
链接:https://www.nowcoder.com/acm/contest/173/A来源:牛客网 题目描述 一个长度为 m 的序列 b[1...m] ,我们定义它的方差为 ,其中 表示序列的平 ...
- [牛客网NOIP赛前集训营-提高组(第一场)]C.保护
链接:https://www.nowcoder.com/acm/contest/172/C来源:牛客网 题目描述 C国有n个城市,城市间通过一个树形结构形成一个连通图.城市编号为1到n,其中1号城市为 ...
- 牛客网NOIP赛前集训营-提高组(第一场)
牛客的这场比赛感觉真心不错!! 打得还是很过瘾的.水平也比较适合. T1:中位数: 题目描述 小N得到了一个非常神奇的序列A.这个序列长度为N,下标从1开始.A的一个子区间对应一个序列,可以由数对[l ...
- 比赛总结——牛客网 NOIP赛前集训营提高组模拟第一场
第一场打的很惨淡啊 t1二分+前缀最小值没想出来,20分的暴力也挂了,只有10分 t2数位dp,调了半天,结果因为忘了判0的特殊情况WA了一个点,亏死 t3emmmm.. 不会 imone说是DSU ...
- 牛客网NOIP赛前集训营-提高组(第一场)B 数数字
数数字 思路: 数位dp 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营-提高组(第一场)A 中位数
中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...
- 牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
[题解] 我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算. 我们还需要确定最小 ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
随机推荐
- 使用Jenkins集成和自动化打包资料
1.手把手教你利用Jenkins持续集成iOS项目 http://www.jianshu.com/p/41ecb06ae95f 2.Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 ...
- linux系统如何更改文件权限
一. 更改文件9个属性:chmod 用这个命令修改文件属性有两种方式:数字或者符号 1. 数字类型改变文件权限 chmod (1)类unix系统的文件有9个属性分别是owner/group/other ...
- spring4-2-bean配置-7-Spring表达式语言SpEL
- Ubuntu14.04下opencv卸载与重装
参考链接:http://askubuntu.com/questions/334158/installing-opencv http://stackoverflow.com/questions/1313 ...
- vue与django中预防CSRF
一.环境: vue2.0.django 1.10.x.iview 二.django后台处理 1.将django的setting的MIDDLEWARE中加入django.middleware.csrf. ...
- Android TV上的焦点切换效果
转载:http://blog.csdn.net/wzlas111/article/details/39741091 Android TV上的焦点凸显特效相信大家都看到过,那么我们就来实现它吧,首先上张 ...
- JVM垃圾回收算法及回收器详解
引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...
- Zookeeper使用--Java API
1 创建节点 创建节点有异步和同步两种方式.无论是异步或者同步,Zookeeper都不支持递归调用,即无法在父节点不存在的情况下创建一个子节点,如在/zk-ephemeral节点不存在的情况下创建/ ...
- Openssl crl命令
一.简介 crl命令用于处里PME或DER格式的CRL文件 二.语法 openssl crl [-inform PEM|DER] [-outform PEM|DER] [-text] [-in fil ...
- 不设置环境变量 直接启动tomcat
window: 设置 startup.bat set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144set JRE_HOME=C:\Program Files ...