当前位置: 首页 > news >正文

COCI2022-2023#1 Neboderi

P9032 [COCI2022-2023#1] Neboderi

题目大意

有一个长度为 n n n的序列 h i h_i hi,你需要从中选择一个长度大于等于 k k k的子区间 [ l , r ] [l,r] [l,r],使得 g × ( h l + h l + 1 + ⋯ + h r ) g\times (h_l+h_{l+1}+\cdots+h_r) g×(hl+hl+1++hr)最小,其中 g = gcd ⁡ ( h l , h l + 1 , … , h r ) g=\gcd(h_l,h_{l+1},\dots,h_r) g=gcd(hl,hl+1,,hr)

1 ≤ k ≤ n ≤ 1 0 6 , 1 ≤ h i ≤ 1 0 6 1\leq k\leq n\leq 10^6,1\leq h_i\leq 10^6 1kn106,1hi106


题解

当确定了 l l l时, gcd ⁡ ( h l , h l + 1 , … , h r ) \gcd(h_l,h_{l+1},\dots,h_r) gcd(hl,hl+1,,hr)随着 r r r的增大而减小。

每当 gcd ⁡ \gcd gcd减小时,其 gcd ⁡ \gcd gcd相对于原来的 gcd ⁡ \gcd gcd肯定有若干个质因数的次数减小。那么,对于一个确定的 l l l gcd ⁡ ( h l , h l + 1 , … , h r ) \gcd(h_l,h_{l+1},\dots,h_r) gcd(hl,hl+1,,hr)的取值不会超过 log ⁡ a l \log a_l logal个数。

先用 S T ST ST表维护区间 gcd ⁡ \gcd gcd。枚举 l l l,在二分每一段 g c d gcd gcd值相等的区间并取该区间的右端点作为 r r r来更新答案。

v v v a i a_i ai的最大值,则时间复杂度为 O ( n log ⁡ n log ⁡ v ) O(n\log n\log v) O(nlognlogv)

当然,这是跑不满的,而且时限为 2.50 s 2.50s 2.50s,所以可以过。


code

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1000000;
int n,k,now,v[N+5],lg[N+5],f[N+5][20];
long long ans=0,sum[N+5];
int gcd(int i,int j){while(j){i%=j;swap(i,j);}return i;
}
int gt(int l,int r){int x=lg[r-l+1];return gcd(f[l][x],f[r-(1<<x)+1][x]);
}
int to(int w,int be,int hv){int l=be+1,r=n,mid;while(l<=r){mid=l+r>>1;if(gt(w,mid)>=hv) l=mid+1;else r=mid-1;}return l-1;
}
int main()
{scanf("%d%d",&n,&k);lg[0]=-1;for(int i=1;i<=n;i++){lg[i]=lg[i/2]+1;scanf("%d",&v[i]);sum[i]=sum[i-1]+v[i];f[i][0]=v[i];}for(int i=1;i<=19;i++){for(int j=1;j<=n-(1<<i-1);j++){f[j][i]=gcd(f[j][i-1],f[j+(1<<i-1)][i-1]);}}for(int l=1,r;l<=n-k+1;l++){now=gt(l,l+k-1);r=to(l,l+k-1,now);while(r<=n){ans=max(ans,gt(l,r)*(sum[r]-sum[l-1]));if(r==n) break;now=gt(l,r+1);r=to(l,r+1,now);}}printf("%lld",ans);return 0;
}
http://www.lryc.cn/news/181316.html

相关文章:

  • 由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll
  • Linux--网络编程-字节序
  • python实现http/https拦截
  • 农产品团购配送商城小程序的作用是什么
  • 使用van-dialog二次封装微信小程序模态框
  • 生鲜蔬果同城配送社区团购小程序商城的作用是什么
  • Unity实现设计模式——状态模式
  • 差分数组的应用技巧
  • 斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs
  • DFS:842. 排列数字
  • pytorch之nn.Conv1d详解
  • H5生成二维码
  • Three.js加载360全景图片/视频
  • 北大硕士7年嵌入式学习经验分享
  • 华为鸿蒙手表开发之动态生成二维码
  • 2023-09-28 monetdb-databae的概念和作用-分析
  • 2024级199管理类联考之数学基础(上篇)
  • RFID技术引领汽车零部件加工新时代
  • python中使用matplotlib绘图
  • Qt Creator 使用技巧
  • 来看看双阶段目标检测算法趴
  • python利用matplotlib绘图,对于中文和负号不显示,显示方框“口口”完美解决办法!!
  • 【数组及指针经典笔试题解析】
  • Transformer学习-self-attention
  • Spring Boot:利用JPA进行数据库的增改
  • 列表的增删改查和遍历
  • 获取网卡上的IP、网关及DNS信息,获取最佳路由,遍历路由表中的条目(附源码)
  • 保姆级 -- Zookeeper超详解
  • 【通意千问】大模型GitHub开源工程学习笔记(2)--使用Qwen进行推理的示例代码解析,及transformers的库使用
  • 从0开始python学习-23.selenium 常见鼠标的操作