Submission #1256424

#TimeUsernameProblemLanguageResultExecution timeMemory
1256424haru09Swap Swap Sort (CCO21_day1problem1)C++20
25 / 25
1341 ms46084 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define fi first #define se second #define task "code" const int ar = 1e5 + 5; const ll mod = 1e9 + 7; const int block = 100; int n, k, q; int a[ar]; int f[ar]; int mp[ar]; ll cost[ar / block + 1][ar]; vector<int> lis[ar]; int bit[ar]; ll ans = 0; void update(int u, int v) { while(u <= n) { bit[u] += v; u += u & (-u); } } int get(int u) { int ans = 0; while(u > 0) { ans += bit[u]; u -= u & (-u); } return ans; } void build() { for (int i = k; i >= 1; i--) { for (int u : lis[i]) ans += get(u); for (int u : lis[i]) update(u, 1); } } ll calc_inversion(int u, int v) { ll ans = 0; int i = 0, j = 0; while(i < lis[u].size() && j < lis[v].size()) { if (lis[u][i] < lis[v][j]) { i++; ans += j; } else j++; } while(i < lis[u].size()) { i++; ans += j; } return ans; } ll calc(int u, int v) { if (lis[u].size() >= block) return 1ll * lis[u].size() * lis[v].size() - cost[mp[u]][v]; if (lis[v].size() >= block) return cost[mp[v]][u]; return calc_inversion(u, v); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin >> n >> k >> q; for (int i = 1; i <= n; i++) cin >> a[i], lis[a[i]].push_back(i); for (int i = 1; i <= k; i++) f[i] = i; int dem = 0; for (int u = 1; u <= k; u++) { if (lis[u].size() < block) continue; int cnt = 0; mp[u] = ++dem; for (int i = 1; i <= n; i++) { if (a[i] == u) cnt++; else cost[mp[u]][a[i]] += cnt; } } build(); while(q--) { int j; cin >> j; ans -= calc(f[j], f[j + 1]); swap(f[j], f[j + 1]); ans += calc(f[j], f[j + 1]); cout << ans << '\n'; } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:78:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:79:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...