[gym102979H]Hotspot-2
记,并定义
以为右端点,记
取最大的使得或,并对中加入
以为左端点,做类似地过程(在同一个中)
结论1:存在一组最优解,满足
证明参考这篇论文
结论2:(不需要去重)
将其划分为若干不下降的极长段,对是否为某段右端点分类讨论:
1.若不是某段右端点,注意到,代入可得,即仅新增个元素
2.若是某段右端点,假设该段左端点为,注意到
若其新增多于个元素,即有,代入和的式子得矛盾
同时,显然,即得证
结合上述两个结论,令表示前个圆且第个圆半径为的答案,双指针转移即可
时间复杂度为,可以通过

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 300005 4 #define ll long long 5 vector<int>v[N]; 6 int n,x[N],dx[N],rs[N]; 7 ll ans,g[N],f[N]; 8 ll sqr(int x){ 9 return (ll)x*x; 10 } 11 int main(){ 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++)scanf("%d",&x[i]); 14 dx[0]=dx[n]=1e9; 15 for(int i=1;i<n;i++)dx[i]=x[i+1]-x[i]; 16 for(int i=1;i<=n;i++){ 17 int r=min(dx[i],dx[i-1]); 18 v[i].push_back(r); 19 for(int j=i-1;j;j--){ 20 int r0=dx[j]-r; 21 if ((r0>dx[j-1])||(r0>r))break; 22 r=r0,v[j].push_back(r); 23 } 24 } 25 for(int i=n;i;i--){ 26 int r=min(dx[i],dx[i-1]); 27 v[i].push_back(r); 28 for(int j=i+1;j<=n;j++){ 29 int r0=dx[j-1]-r; 30 if ((r0>dx[j])||(r0>r))break; 31 r=r0,v[j].push_back(r); 32 } 33 } 34 for(int i=1;i<=n;i++)sort(v[i].begin(),v[i].end()); 35 for(int j=0;j<v[1].size();j++)f[j]=sqr(v[1][j]); 36 for(int i=1;i<n;i++){ 37 for(int j=0;j<v[i].size();j++)g[j]=f[j]; 38 ll mx=0; 39 for(int j=v[i+1].size()-1,k=0;j>=0;j--){ 40 while ((k<v[i].size())&&(v[i][k]<=dx[i]-v[i+1][j]))mx=max(mx,g[k++]); 41 f[j]=mx+sqr(v[i+1][j]); 42 } 43 } 44 for(int j=0;j<v[n].size();j++)ans=max(ans,f[j]); 45 printf("%lld\n",ans); 46 return 0; 47 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现