Submission #1230298

#TimeUsernameProblemLanguageResultExecution timeMemory
1230298sethodArranging Shoes (IOI19_shoes)C++20
100 / 100
350 ms26736 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; int st[525000]; void add(int x, int xl, int xr, int p){ if(xl == xr){ if(xl == p) st[x]++; return; } int mid = (xl + xr) / 2; if(p <= mid) add(x * 2 + 1, xl, mid, p); else add(x * 2 + 2, mid + 1, xr, p); st[x] = st[x * 2 + 1] + st[x * 2 + 2]; return; } int sum(int x, int xl, int xr, int l, int r){ if(xl >= l && xr <= r) return st[x]; if(xr < l || xl > r) return 0; int mid = (xl + xr) / 2; return sum(x * 2 + 1, xl, mid, l, r) + sum(x * 2 + 2, mid + 1, xr, l, r); } long long count_swaps(vector<int> s) { int n = s.size()/2; map<int, priority_queue<int, vector<int>, greater<int>>> r, l; for(int i = 0; i < 2 * n; i++){ if(s[i] > 0){ r[s[i]].push(i); }else{ l[abs(s[i])].push(i); } } vector<int> udh(2 * n, 0); long long ans = 0; for(int i = 0; i < 2*n; i++){ if(!udh[i]){ int pos; if(s[i] > 0) pos = l[s[i]].top(); else pos=r[abs(s[i])].top(); l[abs(s[i])].pop(); r[abs(s[i])].pop(); ans += abs(i - pos) - 1; ans -= sum(0, 0, 2 * n - 1, i + 1, pos); if(s[i] > 0) ans++; udh[pos] = 1; add(0, 0, 2 * n - 1, pos); } } 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...