Submission #797927

#TimeUsernameProblemLanguageResultExecution timeMemory
797927vjudge1Construction of Highway (JOI18_construction)C++17
16 / 100
275 ms612 KiB
#include<bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 5000;

int n;
int p[N];
int C[N];

ll numberOfInverse(int *a, int n) {
    static int b[N];
    if(n == 1) return 0;
    ll ans = numberOfInverse(a, n / 2) + numberOfInverse(a + n / 2, (n + 1) / 2);
    int lb = 0, rb = 0;
    for(int i = n / 2; i < n; i++) {
        while(lb < n / 2 && a[lb] <= a[i]) lb++;
        ans += n / 2 - lb;
    }
    lb = 0, rb = n / 2;
    for(int i = 0; i < n; i++) {
        if(lb == n / 2) {
            b[i] = a[rb++];
            continue;
        }
        if(rb == n) {
            b[i] = a[lb++];
            continue;
        }
        b[i] = (a[lb] <= a[rb] ? a[lb++] : a[rb++]);
    }
    for(int i = 0; i < n; i++) 
        a[i] = b[i];
    return ans;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n;
    for(int i = 1; i <= n; i++) 
        cin >> C[i];
    for(int i = 1; i <= n - 1; i++) {
        int A, B;
        cin >> A >> B;
        int vals[n], len = 0;
        int cur = A;
        while(cur) {
            vals[len++] = C[cur];
            cur = p[cur];
        }
        reverse(vals, vals + len);
        cout << numberOfInverse(vals, len) << '\n';
        
        p[B] = A;
        cur = A;
        while(cur) {
            C[cur] = C[B];
            cur = p[cur];
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...