Submission #573367

#TimeUsernameProblemLanguageResultExecution timeMemory
573367talant117408Arranging Shoes (IOI19_shoes)C++17
100 / 100
172 ms35540 KiB
#include "shoes.h" #include <bits/stdc++.h> #ifndef EVAL #include "grader.cpp" #endif using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; #define pb push_back #define mp make_pair #define all(v) (v).begin(),(v).end() #define sz(v) int((v).size()) #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl '\n' int mod = 1e9+7; ll modulo(ll a) { return ((a % mod) + mod) % mod; } ll add(ll a, ll b) { return modulo(a + b); } ll mult(ll a, ll b) { return modulo(a * b); } ll binpow(ll a, ll b) { ll res = 1; while (b) { if (b&1) { res = mult(res, a); } a = mult(a, a); b >>= 1; } return res; } const int N = 2e5+7; int tree[N*4], lz[N*4]; void push(int v, int l, int r) { if (lz[v] != 0) { tree[v] += lz[v]*(r-l+1); if (l != r) { lz[v*2] += lz[v]; lz[v*2+1] += lz[v]; } lz[v] = 0; } } void update(int v, int l, int r, int ql, int qr) { push(v, l, r); if (ql > r || l > qr) return; if (ql <= l && r <= qr) { lz[v]++; push(v, l, r); return; } int mid = (l+r) >> 1; update(v*2, l, mid, ql, qr); update(v*2+1, mid+1, r, ql, qr); tree[v] = tree[v*2]+tree[v*2+1]; } int get(int v, int l, int r, int pos) { push(v, l, r); if (l == r) return tree[v]; int mid = (l+r) >> 1; if (pos <= mid) return get(v*2, l, mid, pos); else return get(v*2+1, mid+1, r, pos); } long long count_swaps(std::vector<int> s) { multiset <int> pos[sz(s)], neg[sz(s)]; for (int i = 0; i < sz(s); i++) { if (s[i] < 0) neg[abs(s[i])].insert(i); else pos[abs(s[i])].insert(i); } vector <bool> used(sz(s)); ll ans = 0; for (int i = 0; i < sz(s); i++) { if (used[i]) continue; int l = i + get(1, 0, sz(s)-1, i), r; if (s[i] < 0) { r = *pos[abs(s[i])].begin(); used[r] = 1; if (i + 1 != r) { update(1, 0, sz(s)-1, i+1, r-1); } r += get(1, 0, sz(s)-1, r); ans += r-l-1; } else { r = *neg[abs(s[i])].begin(); used[r] = 1; if (i + 1 != r) { update(1, 0, sz(s)-1, i+1, r-1); } r += get(1, 0, sz(s)-1, r); ans += r-l; } neg[abs(s[i])].erase(neg[abs(s[i])].begin()); pos[abs(s[i])].erase(pos[abs(s[i])].begin()); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...