Submission #1292606

#TimeUsernameProblemLanguageResultExecution timeMemory
1292606ortsacArranging Shoes (IOI19_shoes)C++20
100 / 100
317 ms407496 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; #define int long long const int MAXN = 2e5 + 10; int bit[MAXN]; void add(int po) { po++; for (; po < MAXN; po += (po & -po)) bit[po]++; } int pf(int po) { int ans = 0; for (; po > 0; po -= (po & -po)) ans += bit[po]; return ans; } int srange(int l, int r) { l++; r++; return (pf(r) - pf(l - 1)); } int count_swaps(vector<int32_t> s) { int n = s.size(); memset(bit, 0, sizeof bit); vector<bool> mark(n); vector<vector<queue<int>>> pos(2, vector<queue<int>>(n + 1)); for (int i = 0; i < n; i++) pos[s[i] > 0][abs(s[i])].push(i); int ans = 0; for (int i = 0; i < n; i++) { if (mark[i]) continue; int abv = (s[i] > 0); int nxt = pos[1 - abv][abs(s[i])].front(); // i ... nxt int qtdRe = srange(i, nxt); // quantos já foram removidos int swaps = (nxt - i - 1 - qtdRe); if (abv == 1) swaps++; // se for positivo //cout << i << " " << nxt << " " << swaps << " " << qtdRe << "\n"; ans += swaps; pos[0][abs(s[i])].pop(); pos[1][abs(s[i])].pop(); mark[i] = mark[nxt] = 1; add(i); add(nxt); //cout << pf(2) << "\n"; } 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...