Submission #1164085

#TimeUsernameProblemLanguageResultExecution timeMemory
1164085s3yoonparkArranging Shoes (IOI19_shoes)C++20
50 / 100
158 ms158364 KiB
#include <bits/stdc++.h> #define ssize(x) (int)x.size() using namespace std; const int N = 1E5 + 5; int n; map<int,queue<int>> st; bool processed[N]; struct Node { Node *l, *r; long long val; Node (long long v) { val = v, l = nullptr, r = nullptr; } Node (Node *ll, Node *rr) { l = ll, r = rr; val = 0; if (l != nullptr) val = val + l->val; if (r != nullptr) val = val + r->val; } Node (Node *cp) { val = cp->val, l = cp->l, r = cp->r; } }; void build (Node* t, int l = 1, int r = n) { if (l == r) { t->val = 1ll; return; } t->l = new Node(0ll), t->r = new Node(0ll); int mid = (l + r) / 2; build(t->l, l, mid); build(t->r, mid + 1, r); t->val = t->l->val + t->r->val; } void update(Node* t, int ql, int val, int l = 1, int r = n) { if (ql < l || ql > r) return; if (l == r && l == ql) { t->val = val; return; } int mid = (l + r) / 2; update(t->l, ql, val, l, mid); update(t->r, ql, val, mid + 1, r); t->val = t->l->val + t->r->val; } long long query(Node *t, int a, int b, int l = 1, int r = n) { if (b < l || a > r) return 0ll; if (l >= a && r <= b) return t->val; int mid = (l + r) / 2; return query(t->l, a, b, l, mid) + query(t->r, a, b, mid + 1, r); } Node *segtree = new Node(0ll); long long count_swaps(vector<int> S) { n = ssize(S); for (int i = 1; i <= n; i++) { int e = S[i - 1]; st[e].push(i); } build(segtree); int ans = 0; for (int i = 1; i <= n; i++) { int e = S[i - 1], ce = -S[i - 1]; if (processed[i]) continue; int id = st[e].front(), idc = st[ce].front(); st[e].pop(), st[ce].pop(); processed[id] = true, processed[idc] = true; int rid = query(segtree, 1, id), ridc = query(segtree, 1, idc); if (e > 0) { ans += ridc - rid; } else { ans += ridc - rid - 1; } update(segtree, id, 0ll); update(segtree, idc, 0ll); } 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...