Submission #438882

#TimeUsernameProblemLanguageResultExecution timeMemory
438882vkgainzArranging Shoes (IOI19_shoes)C++17
100 / 100
344 ms274988 KiB
#include <bits/stdc++.h> using namespace std; #define int64 int64_t struct seg_tree { vector<int> seg; int sz; void init(int N) { sz = 1; while(sz < N) sz *= 2; seg.resize(2 * sz); } void upd(int i, int x, int lx, int rx) { if(rx - lx == 1) { seg[x] = 1; return; } int m = (lx + rx) / 2; if(i < m) upd(i, 2 * x + 1, lx, m); else upd(i, 2 * x + 2, m, rx); seg[x] = seg[2 * x + 1] + seg[2 * x + 2]; } void upd(int i) { upd(i, 0, 0, sz); } int query(int l, int r, int x, int lx, int rx) { if(lx >= r || rx <= l) return 0; if(lx >= l && rx <= r) return seg[x]; int m = (lx + rx) / 2; return query(l, r, 2 * x + 1, lx, m) + query(l, r, 2 * x + 2, m, rx); } int query(int l, int r) { return query(l, r, 0, 0, sz); } } in; int64 count_swaps(vector<int> S) { int64 ans = 0; int N = (int) S.size(); in.init(N + 1); vector<deque<int>> l(N + 1), r(N + 1); for(int i = 0; i < N; i++) { if(S[i] < 0) { if(!r[-S[i]].empty()) { ans += in.query(r[-S[i]].front(), i) + 1; in.upd(r[-S[i]].front()); in.upd(i); r[-S[i]].pop_front(); } else l[-S[i]].push_back(i); } else { if(!l[S[i]].empty()) { ans += in.query(l[S[i]].front(), i); in.upd(l[S[i]].front()); in.upd(i); l[S[i]].pop_front(); } else r[S[i]].push_back(i); } } 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...