比赛 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;
}