牛客网NOIP赛前集训营-提高组(第四场)B区间
发布日期:2022-02-22 18:04:16 浏览次数:10 分类:技术文章

本文共 1905 字,大约阅读时间需要 6 分钟。

牛客网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\)里面连续的一段取最长的就行了

但是如果有这种数据:

510 6 6 6 9

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

f: 1 2 2 2 5g: 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
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<
<

让我们一起膜拜大佬@

转载于:https://www.cnblogs.com/eric-walker/p/9750394.html

转载地址:https://blog.csdn.net/dengxingrao0615/article/details/102231369 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:博客背景线条实现
下一篇:luogu P1518 两只塔姆沃斯牛 The Tamworth Two

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月08日 16时22分24秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【数据结构与算法】什么是串?什么是KMP算法?字符串匹配是什么? 2019-04-26
【数据结构与算法】什么是布隆过滤器?如何防止缓存穿透的问题? 2019-04-26
【Java锁体系】CopyOnWriteArrayList是什么?线程安全的arraylist是哪个? 2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26
【计算机操作系统】进程管理详解?进程与线程区别是什么?进程调度的算法有哪些?进程通信有哪些? 2019-04-26
【计算机操作系统】虚拟内存是什么?分页系统地址映射?页面置换算法有哪些?分段地址映射又是什么? 2019-04-26
【计算机操作系统】设备管理?磁盘结构是怎么样的?磁盘调度算法有哪些? 2019-04-26
【多线程高并发】为什么要使用多线程?创建多少个线程合适呢? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印1-100两个数?多线程轮流打印数字? 2019-04-26
【多线程与高并发】 Java两个线程轮流打印字符串? 2019-04-26
【Linux命令篇】Linux命令实践 2019-04-26
【Leetcode单调队列】Leetcode239 滑动窗口最大值 2019-04-26
【Leetcode-单调栈】单调栈相关的题目-下一个更大的元素I 每日温度 2019-04-26
【Leetcode单调队列】- 洛谷P1714切蛋糕 2019-04-26
【Leetcode优先级队列】- 数据流的中位数 2019-04-26
【Leetcode优先级队列】-合并K个升序链表 2019-04-26
【多线程与高并发】-Java如何实现一个阻塞队列呢? 2019-04-26
【多线程高并发】-Java使用阻塞队列ArrayBlockingQueue实现生产者消费者模式? 2019-04-26
【多线程高并发】-多线程实现数组的读与写 2019-04-26