比赛 |
2025暑期集训第4场 |
评测结果 |
AAAAA |
题目名称 |
环路运输 |
最终得分 |
100 |
用户昵称 |
淮淮清子 |
运行时间 |
0.802 s |
代码语言 |
C++ |
内存使用 |
57.97 MiB |
提交时间 |
2025-07-05 09:30:09 |
显示代码纯文本
#include<iostream>
using namespace std;
const int MAXN = 2e6 + 5;
int n;
int a[MAXN * 2];
int sum[MAXN * 2];
int st[MAXN * 2][21];
int lg[MAXN * 2 + 1];
int query(int l, int r){
int k = lg[r - l + 1];
return max(st[l][k], st[r - (1 << k) + 1][k]);
}
int main(){
freopen("transportt.in","r",stdin);
freopen("transportt.out","w",stdout);
cin.tie(0) -> ios::sync_with_stdio(0);
lg[1] = 0;
for(int i = 2;i <= MAXN * 2;i ++){
lg[i] = lg[i / 2] + 1;
}
cin >> n;
for(int i = 1;i <= n;i ++){
cin >> a[i];
a[i + n] = a[i];
sum[i] = a[i] - i;
sum[i + n] = a[i] - (i + n);
st[i][0] = sum[i];
st[i + n][0] = sum[i + n];
}
for(int j = 1;j < 21;j ++){
for(int i = 1;i + (1 << j) - 1 <= 2 * n;i ++){
st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
}
int ans = 0;
for(int i = 2;i <= 2 * n;i ++){
int l = max(1, i - n / 2);
int r = i - 1;
if(l > r) continue;
ans = max(ans, query(l, r) + a[i] + i);
}
cout << ans << '\n';
return 0;
}