제출 #950838

#제출 시각아이디문제언어결과실행 시간메모리
950838efishelArranging Shoes (IOI19_shoes)C++17
100 / 100
82 ms76112 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using vll = vector <ll>; struct Fenwick { // 0-indexed vll tree; ll n; Fenwick (ll n): tree(n, 0), n(n) {} ll query (ll ql, ll qr) { return query(qr) - query(ql-1); } ll query (ll at) { // 0-indexed ll ans = 0; for (; at >= 0; at &= at+1, at--) ans += tree[at]; return ans; } void update (ll at, ll val) { // 0-indexed for (; at < n; at |= at+1) tree[at] += val; } }; ll count_swaps (vector <int> vei) { vll ve(vei.size()); ll n = ve.size()/2; for (ll i = 0; i < 2*n; i++) ve[i] = vei[i]; Fenwick ft(2*n); // ft[i] means that there are now ft[i] shoes in position i ll ans = 0; for (ll i = 0; i < 2*n; i++) { ft.update(i, 1); } vll next(2*n, -15); {vector <queue <ll> > nextqs(n+1); for (ll i = 2*n-1; i >= 0; i--) { queue <ll> &q = nextqs[abs(ve[i])]; if (!q.size() || ve[q.front()] == ve[i]) { // not complement q.push(i); } else { // complements next[i] = q.front(); q.pop(); } }} for (ll i = 0; i < 2*n; i++) { ll j = next[i]; if (j < 0) continue; ans += ft.query(i+1, j-1) + (ve[i] > 0); // extra flip ft.update(j, -1); // makes it 0 ft.update(i, 1); // irrelevant but, still, two shoes are now here } 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...