Submission #294397

#TimeUsernameProblemLanguageResultExecution timeMemory
294397albertolg101Arranging Shoes (IOI19_shoes)C++17
100 / 100
199 ms139820 KiB
#include<bits/stdc++.h> #include "shoes.h" using namespace std; long long count_swaps(vector<int> ar) { int n = ar.size(); ar.resize(n + 1); for(int i = n - 1; i >= 0; i--) ar[i + 1] = ar[i]; vector<int> freq(n); vector<queue<int>> dis(n); function<bool(int, int)> diffSign = [](int a, int b) { return ((a < 0 and b > 0) or (a > 0 and b < 0)); }; long long ans = 0; vector<int> bit(n + 1, 0); function<void(int, int)> update = [&](int pos, int val) { for(;pos <= n; pos += (pos & -pos)) bit[pos] += val; }; function<int(int, int)> query = [&](int l, int r) { int Qans = 0; for(int pos = r; pos > 0; pos -= (pos & -pos)) Qans += bit[pos]; for(int pos = l; pos > 0; pos -= (pos & -pos)) Qans -= bit[pos]; return Qans; }; for(int i = 1; i <= n; i++) update(i, 1); for(int i = 1; i <= n; i++) { if(diffSign(freq[abs(ar[i])], ar[i])) { int temp = ar[i] < 0; ar[i] = abs(ar[i]); (freq[ar[i]] < 0 ? freq[ar[i]]++ : freq[ar[i]]--); int last = dis[abs(ar[i])].front(); dis[abs(ar[i])].pop(); ans += query(last, i - 1) + temp; update(i, -1); update(last, 1); } else { ( ar[i] < 0 ? freq[abs(ar[i])]-- : freq[abs(ar[i])]++); ar[i] = abs(ar[i]); dis[ar[i]].push(i); } } 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...