Submission #411617

#TimeUsernameProblemLanguageResultExecution timeMemory
411617emuyumiSwap Swap Sort (CCO21_day1problem1)C++17
25 / 25
1777 ms251992 KiB
#include <bits/stdc++.h>

using namespace std;
#define ms(x,a) memset(x,a,sizeof x)
typedef long long ll;
const int mod=1e9+7, inf=0x3f3f3f3f, MAXN=1e5+1, MAXQ=2e6+1, SZ=5000;

int n, k, q;
int arr[MAXN], tar[MAXN];
int a[MAXQ], b[MAXQ];
ll ans[MAXQ], bad[MAXQ];
int id[MAXN];
set<int> ss;
int cnt[SZ+10];
ll mp[SZ+10][SZ+10];

struct Fenwick{
    int a[MAXN];
    void ins(int i, int v=1){ for (;i<MAXN;i+=i&-i) a[i]+=v; }
    int qry(int i){
        ll ret=0;
        for (;i;i-=i&-i) ret+=a[i];
        return ret;
    }
} bit;

void build(){
    for (int bl=0;bl*SZ<=n;++bl){
        int l=bl*SZ, r=min(n,(bl+1)*SZ-1);
        for (int i=l;i<=r;++i) ss.insert(arr[i]);
        int poi=0;
        for (int x:ss) id[x]=++poi;
        for (int i=l;i<=r;++i){
            arr[i]=id[arr[i]];
            for (int j=1;j<=poi;++j){
                mp[arr[i]][j]+=cnt[j];
            }
            cnt[arr[i]]++;
        }
        // compute answers
        for (int i=1;i<=2*q;++i){
            int aa=id[a[i]];
            int bb=id[b[i]];
            if (aa&&bb) ans[i]+=mp[aa][bb];
            if (aa) ans[i]+=bad[i]*cnt[aa];
            if (bb) bad[i]+=cnt[bb];
        }
        for (int i=1;i<=poi;++i) ms(mp[i],0);
        // resetting
        ss.clear(), ms(id,0);
        ms(cnt,0);
    }
}

int main(){
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> k >> q;
    for (int i=1;i<=n;++i) cin >> arr[i];
    iota(tar+1,tar+1+n,1);
    for (int i=1;i<=q;++i){
        int j; cin >> j;
        a[i*2-1]=tar[j];
        b[i*2-1]=tar[j+1];
        a[i*2]=b[i*2-1];
        b[i*2]=a[i*2-1];
        swap(tar[j],tar[j+1]);
    }
    ll tot=0;
    for (int i=1;i<=n;++i){
        bit.ins(arr[i]);
        tot+=i-bit.qry(arr[i]);
    }
    build();
    for (int i=1;i<=q;++i){
        tot-=ans[i*2-1];
        tot+=ans[i*2];
        // cout << cntinv(a[i],b[i]) << " " << cntinv(b[i],a[i]) << '\n';
        cout << tot << '\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...