제출 #1244119

#제출 시각아이디문제언어결과실행 시간메모리
1244119ollelapArranging Shoes (IOI19_shoes)C++20
100 / 100
158 ms149064 KiB
#include "shoes.h" using namespace std; #include <bits/stdc++.h> #define rep(i,a,b) for(int i = a; i < b; i++) typedef long long ll; // SUM TREE struct SegmTree { vector<ll> T; int n; SegmTree(int n) : T(2 * n, (ll)0), n(n) {} void Update(int pos, ll val) { for (T[pos += n] = val; pos > 1; pos /= 2) T[pos / 2] = T[pos] + T[pos ^ 1]; } ll Query(int b, int e) { ll res = 0; for (b += n, e += n; b < e; b /= 2, e /= 2) { if (b % 2) res = res + T[b++]; if (e % 2) res = res + T[--e]; } return res; } }; long long count_swaps(std::vector<int> arr) { int n = arr.size(); ll ans = 0; vector<queue<int>> pos(n); vector<int> cnt(n, 0); rep(i,0,n) { if (arr[i] > 0) { cnt[arr[i]]--; if (cnt[arr[i]] < 0) pos[arr[i]].push(i); } else { cnt[-arr[i]]++; if (cnt[-arr[i]] <= 0) { int j = pos[-arr[i]].front(); pos[-arr[i]].pop(); swap(arr[i], arr[j]); ans++; } } } vector<vector<int>> p2index(n); vector<int> pointer(n, 0); rep(i,0,n) if (arr[i] > 0) p2index[arr[i]].push_back(i); SegmTree tr(n); rep(i,0,n) { if (arr[i] > 0) continue; ll here = i - tr.Query(0, i); tr.Update(i, 1); int nei = p2index[-arr[i]][pointer[-arr[i]]]; here += nei - tr.Query(0, nei); tr.Update(nei, 1); pointer[-arr[i]]++; ans += here; } return ans; } /* int main() { int n; cin >> n; vector<int>arr(n); rep(i,0,n) cin >> arr[i]; cout << count_swaps(arr) << endl; } */
#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...