Submission #464968

#TimeUsernameProblemLanguageResultExecution timeMemory
464968JovanBSwap Swap Sort (CCO21_day1problem1)C++17
25 / 25
2809 ms116136 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;

const int N = 100000;
const int Q = 1000000;

int bit[N+5];

void bit_add(int x){
    while(x <= N) bit[x]++, x += x & -x;
}

int bit_get(int x){
    int res = 0;
    while(x) res += bit[x], x -= x & -x;
    return res;
}

vector <int> vec[N+5];

map <int, int> gde[N+5];
vector <ll> inv[N+5];
int a[N+5], niz[N+5], swp[Q+5];
vector <pair <int, int>> qs[N+5];
int cnt[N+5];

int main(){
    ios_base::sync_with_stdio(false), cin.tie(0);
    cout.precision(10);
    cout << fixed;

    int n, k, qrs;
    cin >> n >> k >> qrs;
    for(int i=1; i<=n; i++){
        cin >> a[i];
        vec[a[i]].push_back(i);
    }
    ll res = 0;
    int added = 0;
    for(int i=1; i<=n; i++){
        for(auto c : vec[i]) res += added - bit_get(c);
        for(auto c : vec[i]) bit_add(c), added++;
    }
    for(int i=1; i<=k; i++) niz[i] = i;
    for(int i=1; i<=k; i++) inv[i].push_back(0);
    for(int i=1; i<=qrs; i++){
        cin >> swp[i];
        int j = swp[i];
        int x = niz[j], y = niz[j+1];
        if(gde[x].count(y) || gde[y].count(x)){
            swap(niz[j], niz[j+1]);
            continue;
        }
        if(vec[x].size() > vec[y].size()) swap(x, y);
        inv[x].push_back(0);
        gde[x][y] = inv[x].size() - 1;
        qs[x].push_back({y, inv[x].size() - 1});
        swap(niz[j], niz[j+1]);
    }
    for(int i=1; i<=n; i++){
        for(auto pr : qs[a[i]]) inv[a[i]][pr.second] += cnt[pr.first];
        cnt[a[i]]++;
    }
    for(int i=1; i<=k; i++) niz[i] = i;
    for(int i=1; i<=qrs; i++){
        int j = swp[i];
        int x = niz[j], y = niz[j+1];
        if(gde[x].count(y)) res += 1LL*vec[x].size()*vec[y].size() - 2*inv[x][gde[x][y]];
        else res += 2*inv[y][gde[y][x]] - 1LL*vec[x].size()*vec[y].size();
        cout << res << "\n";
        swap(niz[j], niz[j+1]);
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...