Submission #395489

#TimeUsernameProblemLanguageResultExecution timeMemory
395489luisgalanArranging Shoes (IOI19_shoes)C++14
50 / 100
502 ms560544 KiB
#pragma GCC optimization ("O3") #include<bits/stdc++.h> #include "shoes.h" using namespace std; typedef long long int ll; const ll MAX_N = ll(1e5 + 3); ll st[4 * MAX_N]; void build(ll p, ll tl, ll tr) { if (tl == tr) { st[p] = 0; return; } ll m = (tl + tr) / 2; build(2*p, tl, m); build(2*p+1, m+1, tr); st[p] = st[2*p] + st[2*p+1]; } ll query(ll p, ll tl, ll tr, ll l, ll r) { if (l > r) return 0; if (tl == l && tr == r) { return st[p]; } ll m = (tl + tr) / 2; ll L = query(2*p, tl, m, l, min(r, m)); ll R = query(2*p+1, m+1, tr, max(l, m+1), r); return L + R; } void update(ll p, ll tl, ll tr, ll k, ll v) { if (tl == tr) { st[p] = v; return; } ll m = (tl + tr) / 2; if (k <= m) { update(2*p, tl, m, k, v); } else { update(2*p+1, m+1, tr, k, v); } st[p] = st[2*p] + st[2*p+1]; } ll count_swaps(vector<int> s) { ll n = s.size(); vector<ll> taken(n); vector<queue<ll>> neg(n + 1); vector<queue<ll>> pos(n + 1); vector<ll> pairs(n); // make pairs for (ll i = 0; i < n; i++) { if (s[i] < 0) { if (!pos[-s[i]].empty()) { pairs[pos[-s[i]].front()] = i; pos[-s[i]].pop(); } else { neg[-s[i]].push(i); } } else { if (!neg[s[i]].empty()) { pairs[neg[s[i]].front()] = i; neg[s[i]].pop(); } else { pos[s[i]].push(i); } } } build(1, 0, n-1); ll ans = 0; for (ll i = 0; i < n; i++) { if (taken[i]) continue; ll j = pairs[i]; ans += j - i - query(1, 0, n-1, i, j); if (s[i] < 0) ans--; taken[i] = true; taken[j] = true; update(1, 0, n-1, i, taken[i]); update(1, 0, n-1, j, taken[j]); } return ans; } // queue for each shoe size // use queue to find best pairs // use something like a segtree to find number of swaps for each pair

Compilation message (stderr)

shoes.cpp:1: warning: ignoring #pragma GCC optimization [-Wunknown-pragmas]
    1 | #pragma GCC optimization ("O3")
      |
#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...