Циклічні зсуви#13060

Циклічні зсуви (Розбір)

Автор задачі:

Andrii Kholod (Connect)

Підготував:

Andrii Kholod (Connect)

Розбір:

Andrii Kholod (Connect)

Розв'язання

Припустимо, що ми зсунули перестановку на позицій, а перестановку на позицій.

Немає сенсу зсувати будь-яку перестановку хоча б разів, оскільки після циклічних зсувів вона повернеться у початковий стан. Тому достатньо розглядати 0 \le x,y<n.

Зафіксуємо відносний зсув

r=(y-x+n)\bmod n.

Для фіксованого розглянемо циклічну послідовність

d_i=a_i-b_{(i+r)\bmod n}.

Якщо зсунути на позицій, тоді потрібно зсунути на (s+r)\bmod n позицій.

Отже, послідовність різниць між відповідними елементами зсунутих перестановок є циклічним зсувом послідовності , який починається з позиції .

Умова задачі вимагає, щоб для кожного префікса сума елементів була не меншою за суму елементів .

Тобто нам потрібно, щоб усі префіксні суми відповідного циклічного зсуву були невід'ємними.

Оскільки та є перестановками однакових чисел,

\sum_{i=1}^{n} d_i=0.

Нехай

P_0=0,

а для 1\le k\le n визначимо

P_k=d_1+d_2+\ldots+d_k.

Доведемо, що циклічна послідовність, яка починається з позиції s+1, є коректною тоді й лише тоді, коли P_s є мінімальним серед

P_0,P_1,\ldots,P_{n-1}.

Припустимо, що P_s є мінімальним.

До моменту переходу через кінець послідовності кожна префіксна сума циклічного зсуву має вигляд

P_j-P_s

для деякого j>s.

Оскільки P_s є мінімальним, маємо P_j\ge P_s, тому це значення невід'ємне.

Після того як ми пройдемо кінець послідовності та продовжимо з її початку, префіксна сума матиме вигляд

(P_n-P_s)+P_j.

Але P_n=0, оскільки загальна сума дорівнює нулю. Тому це значення дорівнює

P_j-P_s,

що також є невід'ємним.

Отже, кожна позиція, яка відповідає мінімальній префіксній сумі, задає коректний циклічний зсув.

Тепер припустимо, що P_s не є мінімальним.

Тоді існує деяке , для якого P_j<P_s. Під час циклічного проходу, починаючи з позиції s+1, у певний момент ми дійдемо до цього префікса та отримаємо від'ємну суму.

Отже, така початкова позиція не може бути коректною.

Тому для кожного зафіксованого відносного зсуву нам достатньо обчислити всі префіксні суми та знайти їх мінімум.

Для кожної позиції , у якій досягається цей мінімум, кількість зсувів перестановки дорівнює

x=s,

а кількість зсувів перестановки дорівнює

y=(s+r)\bmod n.

Отже, загальна кількість операцій дорівнює

s+(s+r)\bmod n.

Переберемо всі можливих значень . Для кожного з них обчислимо префіксні суми за та перевіримо всі позиції, у яких досягається мінімум.

Часова складність розв'язання — O(n^2).

Просторова складність — .

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define endl '\n'

const ll clasik = 5005;

ll a[clasik] , b[clasik] , pref[clasik];

signed main() {
    speed;

    ll n;

    cin>>n;

    for (int i = 1 ; i<=n ; i++) cin>>a[i];

    for (int i = 1 ; i<=n ; i++) cin>>b[i];

    ll ans = 2*n;

    for (int r = 0 ; r<n ; r++) {

        pref[0] = 0;

        for (int i = 1 ; i<n ; i++) {
            ll pos = (i+r-1)%n+1;

            pref[i] = pref[i-1] + a[i] - b[pos];
        }

        ll mn = pref[0];

        for (int i = 1 ; i<n ; i++) {
            mn = min(mn , pref[i]);
        }

        for (int s = 0 ; s<n ; s++) {
            if (pref[s] != mn) continue;

            ll x = s;
            ll y = (s+r)%n;

            ans = min(ans , x+y);
        }
    }

    cout<<ans<<endl;

    return 0;
}