Submission #1166691

#TimeUsernameProblemLanguageResultExecution timeMemory
1166691SG2AlokArranging Shoes (IOI19_shoes)C++20
50 / 100
29 ms16200 KiB
#include "shoes.h" #include <bits/stdc++.h> #define ll long long using namespace std; vector<ll> pos[100005][2]; ll st[400005], lazy[400005]; void build(ll l, ll r, ll pos){ if(l == r){ st[pos] = l; return; } ll mid = (l + r) / 2; build(l, mid, pos * 2); build(mid + 1, r, pos * 2 + 1); st[pos] = max(st[pos * 2], st[pos * 2 + 1]); } void prop(ll pos){ st[pos * 2] += lazy[pos]; lazy[pos * 2] += lazy[pos]; st[pos * 2 + 1] += lazy[pos]; lazy[pos * 2 + 1] += lazy[pos]; lazy[pos] = 0; } void update(ll l, ll r, ll L, ll R, ll pos, ll val){ if(l > R || r < L) return; if(L <= l && r <= R){ st[pos] += val; lazy[pos] += val; return; } prop(pos); ll mid = (l + r) / 2; update(l, mid, L, R, pos * 2, val); update(mid + 1, r, L, R, pos * 2 + 1, val); st[pos] = max(st[pos * 2], st[pos * 2 + 1]); } void update2(ll l, ll r, ll idx, ll pos, ll val){ if(l == r){ st[pos] = val; return; } prop(pos); ll mid = (l + r) / 2; if(idx <= mid) update2(l, mid, idx, pos * 2, val); else update2(mid + 1, r, idx, pos * 2 + 1, val); st[pos] = max(st[pos * 2], st[pos * 2 + 1]); } ll query(ll l, ll r, ll L, ll R, ll pos){ if(l > R || r < L) return 0; if(L <= l && r <= R) return st[pos]; prop(pos); ll mid = (l + r) / 2; return max(query(l, mid, L, R, pos * 2), query(mid + 1, r, L, R, pos * 2 + 1)); } long long count_swaps(std::vector<int> s) { for(int i = s.size() - 1; i >= 0; i--){ pos[abs(s[i])][s[i] > 0].push_back(i + 1); } build(1, s.size(), 1); ll ans = 0; vector<bool> udah(s.size() + 2); for(int i = 0; i < s.size(); i++){ if(udah[i]) continue; ll nxt = pos[abs(s[i])][s[i] < 0].back(); ans += query(1, s.size(), nxt, nxt, 1) - query(1, s.size(), i + 1, i + 1, 1) - 1 + (s[i] > 0); update(1, s.size(), i + 2, nxt - 1, 1, 1); update2(1, s.size(), nxt, 1, i + 2); pos[abs(s[i])][0].pop_back(); pos[abs(s[i])][1].pop_back(); udah[i] = true; udah[nxt - 1] = true; } 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...