Submission #696418

#TimeUsernameProblemLanguageResultExecution timeMemory
696418benedict0724Swap Swap Sort (CCO21_day1problem1)C++17
25 / 25
1049 ms55680 KiB
#include <iostream>
#include <stack>
#include <string>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <cassert>

using namespace std;
typedef long long ll;

int T[100002], n, k, q;
int A[100002], per[100002];
int num[100002];
vector<int> idx[100002];
ll cnt[100002];
vector<vector<ll>> pre;

void upd(int x, int v)
{
    for(int i=x;i<=n;i+=(i&-i)) T[i] += v;
}

int f(int x)
{
    int ret = 0;
    for(int i=x;i;i^=(i&-i)) ret += T[i];
    return ret;
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(NULL);
    cin >> n >> k >> q;
    for(int i=1;i<=k;i++) per[i] = i;
    
    int B = 100;
    
    ll ans = 0;
    for(int i=0;i<n;i++)
    {
        cin >> A[i];
        
        upd(A[i], 1);
        ans += i + 1 - f(A[i]);
        
        idx[A[i]].push_back(i);
        cnt[A[i]]++;
    }
    
    int asdf = 0;
    for(int i=1;i<=k;i++)
    {
        if(cnt[i] > B)
        {
            vector<ll> v(k+1);
            ll now = 0;
            for(int j=0;j<n;j++)
            {
                if(A[j] == i) now++;
                else v[A[j]] += now;
            }
            pre.push_back(v);
            num[i] = asdf++;
        }
    }
    
    for(int i=1;i<=q;i++)
    {
        int x; cin >> x;
        int a = per[x], b = per[x+1];
        
        swap(per[x], per[x+1]);
        
        if(cnt[a] > B)
        {
            ans -= cnt[a] * cnt[b];
            ans += 2 * pre[num[a]][b];
            
            cout << ans << "\n";
            continue;
        }
        if(cnt[b] > B)
        {
            ans -= 2 * pre[num[b]][a];
            ans += cnt[a] * cnt[b];
            
            cout << ans << "\n";
            continue;
        }
        
        ll tmp = 0;
        for(int t1=0,t2=0;t2<cnt[b];)
        {
            if(t1 == cnt[a])
            {
                t2++;
                tmp += t1;
            }
            else if(idx[a][t1] < idx[b][t2]) t1++;
            else
            {
                t2++;
                tmp += t1;
            }
        }
        ans += 2 * tmp;
        ans -= cnt[a] * cnt[b];
        cout << ans << "\n";
    }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...