제출 #893503

#제출 시각아이디문제언어결과실행 시간메모리
893503KaleemRazaSyedArranging Shoes (IOI19_shoes)C++17
100 / 100
49 ms15196 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5+5; vector<int> v[N][2]; int ft[2 * N]; void update(int i) { while(i < 2 * N) { ft[i]++; i += (i & -i); } } int sm(int i) { int ans = 0; while(i > 0) { ans += ft[i]; i -= (i & -i); } return ans; } long long count_swaps(vector<int> S) { int tn = S.size(); // two * n for(int i = tn - 1; i >= 0; i--) { if(S[i] > 0) v[S[i]][0].push_back(i); else v[-S[i]][1].push_back(i); } bool paired[tn]; long long ans = 0; memset(paired, false, sizeof(paired)); for(int i = 0; i < tn; i++) { if(paired[i]) continue; int val = -S[i], j; if(val > 0) { while(paired[v[val][0].back()]) v[val][0].pop_back(); j = v[val][0].back(); v[val][0].pop_back(); } else { while(paired[v[-val][1].back()]) v[-val][1].pop_back(); j = v[-val][1].back(); v[-val][1].pop_back(); } paired[i] = paired[j] = true; ans += j - i - 1; ans -= sm(j + 1) - sm(i + 1); update(i + 1); update(j + 1); if(S[i] > 0) ans++; } return ans; } /*int main() { int n; cin >> n; vector<int> S(2 * n); for(int & i : S) cin >> i; cout << count_swaps(S) << endl; return 0; } */
#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...