«Круговой процесс» транспортный цикл

Название Описание

Здесь Insert Picture Описание

решение проблемы

Очень очевидный вывод, если мы хотим вычислить Ij (я <у) Ответ:

  • если я - J & GT; n 2 IJ & GT; \ гидроразрыва {N} {2} Необходимо выбрать n ( i j ) = j + n i . n- (Ij) = J + п. В это время ( j + n ) i &lt; n 2 (J + N) -i & л; \ гидроразрыва {N} {2} В этом случае сводится к решению j + n J + п и i я отвечу.
  • В противном случае выберите i j . IJ.

На данный момент, мы можем удвоить диапазон, расстояние решается n 2 \ Гидроразрыва {N} {2} Внутренний, a [ j ] j а [J] -j значение максимальногобаллов.

На данный момент мы можем использовать очереди приоритета для сохранения, это все еще очень просто. '

Поэтому кольцо в решении этой проблемы, мы можем также рассмотреть возможность расширения метода удвоить, чтобы решить эту проблему.

Код выглядит следующим образом:

#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;
}

рекомендация

отblog.csdn.net/Ronaldo7_ZYB/article/details/92642637