Submission #403799

#TimeUsernameProblemLanguageResultExecution timeMemory
403799dxz05Arranging Shoes (IOI19_shoes)C++14
10 / 100
203 ms273652 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 4e5 + 6e3; int n; int f[MAXN]; void add(int x, int y){ x++; while (x < MAXN){ f[x] += y; x += (-x & x); } } void add(int l, int r, int y){ if (l > r) return; add(l, y); add(r + 1, -y); } int get(int x){ x++; int sum = 0; while (x > 0){ sum += f[x]; x -= (-x & x); } return sum; } int get(int l, int r){ return get(r) - get(l - 1); } int code(int val){ return (val < 0 ? -val : val + 200000); } queue<int> q[MAXN]; long long count_swaps(vector<int> a) { n = a.size(); set<pair<int, int>> s; for (int i = 0; i < n; i++){ int x = code(a[i]); q[x].push(i); s.insert(make_pair(q[x].front(), a[i])); } ll ans = 0; while (!s.empty()) { int val = s.begin()->second; s.erase(s.begin()); int x = code(val), y = code(-val); s.erase(make_pair(q[y].front(), -val)); int i = q[x].front(), j = q[y].front(); i += get(i), j += get(j); if (val > 0) swap(i, j); if (i < j) ans += j - i - 1; else ans += i - j; q[x].pop(); q[y].pop(); if (!q[x].empty()) s.insert(make_pair(q[x].front(), val)); if (!q[y].empty()) s.insert(make_pair(q[y].front(), -val)); } 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...