제출 #723809

#제출 시각아이디문제언어결과실행 시간메모리
723809t6twotwoArranging Shoes (IOI19_shoes)C++17
100 / 100
164 ms139756 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
long long count_swaps(vector<int> s) {
    int n = s.size() / 2;
    vector<queue<int>> q(2 * n + 1);
    vector<int> p(2 * n, -1);
    for (int i = 0; i < 2 * n; i++) {
        int x = n + s[i];
        int y = n - s[i];
        if (!q[y].empty()) {
            p[q[y].front()] = i;
            q[y].pop();
        } else {
            q[x].push(i);
        }
    }
    vector<int> bit(2 * n + 1);
    auto add = [&](int p, int v) {
        for (int i = p + 1; i <= 2 * n; i += i & -i) {
            bit[i] += v;
        }
    };
    auto sum = [&](int p) {
        int ans = 0;
        for (int i = p; i > 0; i -= i & -i) {
            ans += bit[i];
        }
        return ans;
    };
    auto range_sum = [&](int l, int r) {
        return sum(r) - sum(l);
    };
    for (int i = 0; i < 2 * n; i++) {
        add(i, 1);
    }
    int64_t ans = 0;
    for (int i = 0; i < 2 * n; i++) {
        if (p[i] == -1) continue;
        ans += range_sum(i + 1, p[i]) + (s[i] > 0);
        add(p[i], -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...