Название Описание
решение проблемы
Очень очевидный вывод, если мы хотим вычислить Ij (я <у) Ответ:
- если Необходимо выбрать В это время В этом случае сводится к решению и отвечу.
- В противном случае выберите
На данный момент, мы можем удвоить диапазон, расстояние решается Внутренний, значение максимальногобаллов.
На данный момент мы можем использовать очереди приоритета для сохранения, это все еще очень просто. '
Поэтому кольцо в решении этой проблемы, мы можем также рассмотреть возможность расширения метода удвоить, чтобы решить эту проблему.
Код выглядит следующим образом:
#include <bits/stdc++.h>
using namespace std;
const int N = 2000000;
int n, h = 1, t = 0, ans = 0;
int a[N], q[N];
inline int read(void)
{
int s = 0, w = 1; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') s = s*10+c-48, c = getchar();
return s * w;
}
int main(void)
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
n = read();
for (int i=1;i<=n;++i) a[i] = a[i+n] = read();
for (int i=1;i<=n*2;++i)
{
while (h <= t && i-q[h] > n/2) h ++;
ans = max(ans,a[i]+i+a[q[h]]-q[h]);
while (h <= t && a[i]-i >= a[q[t]]-q[t]) t --;//注意维护a[i]-i的最小值
q[++t] = i;
}
cout << ans <<endl;
return 0;
}