CH5501 环路运输(单调栈)
2024-09-07 10:00:32
传送门
思路:
遇到一个环,用正常人类的思想就先把环从中间截断然后将其补成2*n长度的链。环上的最小距离换到链上就是i以n/2为半径范围内的点(画图肉眼可见)。由于两个点是等价的,所以我们考虑有序对(i,j){1<=j<i<=2*n&&i-j<=n/2}。
题目要求最大的a[i]+a[j]+dis(i,j)。在上述条件下,dis(i,j)=i-j。那么就是要求a[i]+a[j]+i-j,只要枚举i,得到最大的a[j]-j就好了,考虑j的取值范围[i-n/2,i-1],用单调栈维护a[i]-j。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
int a[*maxn],q[*maxn],tail,head,ans;
int main()
{
int n;scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=+n;i<=*n;i++) a[i]=a[i-n];
int c=n/;
for(int i=;i<=c;i++){
while(tail&&a[q[tail]]-q[tail]<=a[i]-i)
tail--;
q[++tail]=i;
}
head=;
ans=a[c+]+c+-q[head]+a[q[head]];
for(int i=;i<=n;i++){
int id=c-+i;
while(head<=tail&&q[head]<i) head++;
while(tail>=head&&a[q[tail]]-q[tail]<=a[id]-id) tail--;
q[++tail]=id;
ans=max(ans,a[id+]+id+-q[head]+a[q[head]]);
}
cout<<ans<<endl;
}
最新文章
- Oracle三大经典表连接适用情况
- jenkins2 hello pipeline
- div滑入与滑出
- php 上传文件。$_FILES
- 【转】Dr.com 5.20破解教程
- 0301——UItableView
- iOS 之 cocoapods安装与使用
- Retrofit相关资料
- diplay:table-cell和伪元素:after方法让图片居中
- flask-日料网站搭建-数据库操作
- iOS 点击屏幕空白区隐藏键盘方法
- 如何用浏览器在线查看.ipynb文件
- 【Python 17】B分R计算器1.0(数值类型)
- tornado--初识tornado
- Codeforces 1139E Maximize Mex 二分图匹配
- 和textrank4ZH代码一模一样的算法详细解读
- CAD技巧之002——如何用Cass内插高程点或者说加密高程点
- 在Hanlp词典手动添加未登录词的方式介绍
- Springmvc配置时间日期转换
- Form表单中的action提交路径问题