제출 #1175086

#제출 시각아이디문제언어결과실행 시간메모리
1175086banganArranging Shoes (IOI19_shoes)C++20
100 / 100
52 ms20652 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; // #define int long long #define pb push_back long long count_swaps(std::vector<int> s) { #define int long long int n = (int)s.size(); vector<vector<int>> pos(n + 1), neg(n + 1); for (int i = n - 1; i >= 0; i--) { if (s[i] < 0) { neg[-s[i]].pb(i); } else { pos[s[i]].pb(i); } } vector<int> fen(2 * n); auto update = [&](int i, int v) { for (++i ; i < 2 * n; i += i & -i) { fen[i] += v; } }; auto sum = [&](int i) { int ret = 0; for (++i ; i; i -= i & -i) { ret += fen[i]; } return ret; }; auto get = [&](int l, int r) { if (l == 0) { return sum(r); } else { return sum(r) - sum(l - 1); } }; for (int i = 0; i < n; i++) { update(i, 1); } long long ans = 0; for (int i = 0; i < n; i++) { if (s[i] < 0) { if (neg[-s[i]].empty() || neg[-s[i]].back() != i) { continue; } int j = pos[-s[i]].back(); pos[-s[i]].pop_back(); neg[-s[i]].pop_back(); ans += get(i, j) - 2; update(i, -1); update(j, -1); } else { if (pos[s[i]].empty() || pos[s[i]].back() != i) { continue; } int j = neg[s[i]].back(); neg[s[i]].pop_back(); pos[s[i]].pop_back(); ans += get(i, j) - 2 + 1; update(i, -1); update(j, -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...