Submission #995076

#TimeUsernameProblemLanguageResultExecution timeMemory
995076vyshniak_nSwap Swap Sort (CCO21_day1problem1)C++17
25 / 25
2698 ms507216 KiB
#pragma optimize("Ofast") #pragma optimize("unroll-loops") #pragma traget("avx,avx2") #include <iostream> #include <cmath> #include <algorithm> #include <stdio.h> #include <cstdint> #include <cstring> #include <string> #include <cstdlib> #include <vector> #include <bitset> #include <map> #include <queue> #include <ctime> #include <stack> #include <set> #include <list> #include <random> #include <deque> #include <functional> #include <iomanip> #include <sstream> #include <fstream> #include <complex> #include <numeric> #include <cassert> #include <array> #include <tuple> #include <unordered_map> #include <unordered_set> #include <thread> typedef long long ll; typedef unsigned long long ull; typedef long double ld; #define el '\n' #define ff first #define ss second #define pb push_back #define pf push_front #define popb pop_back #define popf pop_front #define point pair <ll, ll> #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() using namespace std; #include <random> mt19937 rnd(time(0)); const ll INF = 1e18 + 10; const ll inf = 1e9 + 10; const ll N = 1e5 + 10; const ll mod = 1e9 + 7; const ll LOG = 20; const int K = 1e3 + 20; const int SZ = 1e2 + 20; int a[N], id[SZ][N], diff[SZ], dp[SZ][K][K], every[SZ][N]; // fenwick tree struct fenwick_tree { vector <ll> fen; int sz; fenwick_tree(int n) { sz = n; fen.resize(sz + 1); } void upd(int v, ll val) { for (; v <= sz; v = (v | (v + 1))) fen[v] += val; } ll get(int v) { ll res = 0; for (; v >= 0; v = (v & (v + 1)) - 1) res += fen[v]; return res; } }; void solve() { int n, k, q; cin >> n >> k >> q; for (int i = 0; i < n; i++) cin >> a[i]; vector <int> p(k + 1); for (ll i = 1; i <= k; i++) p[i] = i; // calc for every block int sz = (n + K - 1) / K; for (int i = 0; i < sz; i++) for (int j = 0; j < N; j++) id[i][j] = -1; for (int i = 0; i < n; i++) { if (id[i / K][a[i]] == -1) id[i / K][a[i]] = diff[i / K]++; every[i / K][a[i]]++; } for (int i = 0; i < sz; i++) { for (int f = 0; f < diff[i]; f++) { int l = i * K, r = min((i + 1) * K - 1, n - 1); int cnt[K]; for (int j = 0; j < K; j++) cnt[j] = 0; int cur = 0; for (int j = r; j >= l; j--) { if (id[i][a[j]] == f) cur++; else cnt[id[i][a[j]]] += cur; } for (int j = 0; j < K; j++) dp[i][f][j] = cnt[j]; } } // count the number of operation for permutation like {1, 2, 3, ...} fenwick_tree used(n), ans(k); vector <int> pos[k + 1]; for (int i = 0; i < n; i++) pos[a[i]].pb(i); ll already = 0; for (int i = 1; i <= k; i++) { ll cur = 0; for (int x : pos[i]) { cur += x + used.get(n - 1) - used.get(x) - already; already++; used.upd(x, 1); } ans.upd(i, cur); } // queries while (q--) { int x; cin >> x; ll l = ans.get(x) - ans.get(x - 1); ll r = ans.get(x + 1) - ans.get(x); ans.upd(x, -l); ans.upd(x + 1, -r); ll cur, suff; cur = 0, suff = 0; for (int i = sz - 1; i >= 0; i--) { cur += every[i][p[x + 1]] * 1ll * suff; suff += (ll)every[i][p[x]]; if (id[i][p[x]] == -1 || id[i][p[x + 1]] == -1) continue; cur += dp[i][id[i][p[x]]][id[i][p[x + 1]]]; } r -= cur; swap(p[x], p[x + 1]); cur = 0, suff = 0; for (int i = sz - 1; i >= 0; i--) { cur += every[i][p[x + 1]] * 1ll * suff; suff += (ll)every[i][p[x]]; if (id[i][p[x]] == -1 || id[i][p[x + 1]] == -1) continue; cur += dp[i][id[i][p[x]]][id[i][p[x + 1]]]; } l += cur; ans.upd(x, r); ans.upd(x + 1, l); cout << ans.get(k) << el; } return; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tests = 1; //cin >> tests; while (tests--) solve(); return 0; } /* */

Compilation message (stderr)

Main.cpp:1: warning: ignoring '#pragma optimize ' [-Wunknown-pragmas]
    1 | #pragma optimize("Ofast")
      | 
Main.cpp:2: warning: ignoring '#pragma optimize ' [-Wunknown-pragmas]
    2 | #pragma optimize("unroll-loops")
      | 
Main.cpp:3: warning: ignoring '#pragma traget ' [-Wunknown-pragmas]
    3 | #pragma traget("avx,avx2")
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...