Submission #154132

#TimeUsernameProblemLanguageResultExecution timeMemory
15413279brueArranging Shoes (IOI19_shoes)C++14
100 / 100
285 ms141576 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; typedef long long ll; int n; int arr[200002]; int match[200002]; queue<int> matchIdx[200002]; bool chk[200002]; struct fenwick{ int size; ll tree[1000002]; fenwick(){} void reset(int x){ size = x; fill(tree, tree+x+1, 0LL); } ll getSum(int i){ ll ans = 0; while(i>0){ ans += tree[i]; i -= (i&-i); } return ans; } ll getSum(int l, int r){ return getSum(r) - getSum(l-1); } void update(int i, ll val){ while(i<=size){ tree[i] += val; i += (i&-i); } } } tree; ll count_swaps(vector<int> _arr) { ll ans=0; n = (int)_arr.size(); for(int i=1; i<=n; i++) arr[i] = _arr[i-1]; tree.reset(n); for(int i=1; i<=n; i++){ tree.update(i, 1); if(matchIdx[abs(arr[i])].empty()) matchIdx[abs(arr[i])].push(i); else{ int tmp = matchIdx[abs(arr[i])].front(); if(arr[tmp] != arr[i]){ match[tmp] = i; match[i] = tmp; matchIdx[abs(arr[i])].pop(); } else{ matchIdx[abs(arr[i])].push(i); } } } for(int i=1; i<=n; i++){ if(chk[match[i]]) continue; chk[i] = 1; int tmp = match[i]; ans += tree.getSum(i, tmp) - 2; if(arr[i] > 0) ans++; tree.update(i, -1); tree.update(tmp, -1); } 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...