제출 #510113

#제출 시각아이디문제언어결과실행 시간메모리
510113ETKSwap Swap Sort (CCO21_day1problem1)C++14
25 / 25
3249 ms88188 KiB
#include <bits/stdc++.h> #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define per(i,a,b) for(int i=(a);i>=(b);--i) #define pii pair<int,int> #define vi vector<int> #define mp make_pair #define fi first #define se second #define pb push_back #define debug(...) fprintf(stderr, __VA_ARGS__) #define ALL(x) x.begin(),x.end() #define sz(x) int(x.size()) #define ll long long using namespace std; inline ll read(){ ll x=0,f=1;char ch=getchar(); while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();} while (isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f; } const int N=2e5+5; int n,k,q,id[N],a[N]; int t[N]; void add(int x,int v){for(;x <= n;x += x & -x)t[x] += v;} ll Q(int x){ ll res = 0; for(;x;x -= x & -x)res += t[x]; return res; } vector <int> pos[N]; map <pii,ll> S; ll work(int a,int b){ ll tot = (ll)sz(pos[a]) * sz(pos[b]); if(S.count(mp(a,b)))return S[mp(a,b)]; if(S.count(mp(b,a)))return tot - S[mp(b,a)]; ll res = 0; if(sz(pos[a]) < sz(pos[b])){ for(auto x : pos[a]) res += lower_bound(ALL(pos[b]),x) - pos[b].begin(); }else{ for(auto x : pos[b]) res += pos[a].end() - upper_bound(ALL(pos[a]),x); } return S[mp(a,b)] = res; } int main(){ n = read(),k = read(),q = read(); rep(i,1,n){ a[i] = read(); pos[a[i]].pb(i); } rep(i,1,n)id[i] = i; ll ans = 0; rep(i,1,n){ ans += Q(k) - Q(a[i]); add(a[i],1); } while(q--){ int x = read(); ans += (ll)sz(pos[id[x]]) * sz(pos[id[x+1]]) - 2 * work(id[x],id[x+1]); printf("%lld\n",ans); swap(id[x],id[x+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...