제출 #1221565

#제출 시각아이디문제언어결과실행 시간메모리
1221565nibertArranging Shoes (IOI19_shoes)C++20
10 / 100
0 ms328 KiB
#include "shoes.h"
#include <vector>
#include <map>
#include <deque>
using namespace std;

// Fenwick Tree (Binary Indexed Tree) for inversion counting
struct Fenwick {
    int n;
    vector<int> bit;
    Fenwick(int size) : n(size), bit(size + 2, 0) {}

    void add(int index, int val) {
        for (++index; index <= n + 1; index += index & -index)
            bit[index] += val;
    }

    int sum(int index) {
        int result = 0;
        for (++index; index > 0; index -= index & -index)
            result += bit[index];
        return result;
    }
};

// Main function required by the grader
long long count_swaps(vector<int> S) {
    int n = S.size();
    map<int, deque<int>> pos;
    vector<bool> visited(n, false);
    vector<int> target(n);
    
    // Map positions of each shoe value
    for (int i = 0; i < n; ++i)
        pos[S[i]].push_back(i);

    for (int i = 0; i < n; ++i) {
        if (visited[i]) continue;
        int shoe = S[i];
        int pair_index;
        
        if (shoe < 0) {
            pair_index = pos[-shoe].front();
            pos[-shoe].pop_front();
        } else {
            pair_index = pos[-shoe].front();
            pos[-shoe].pop_front();
        }

        visited[i] = visited[pair_index] = true;

        if (shoe < 0) {
            target[i] = 0;          // left shoe comes first
            target[pair_index] = 1;
        } else {
            target[pair_index] = 0; // left shoe comes first
            target[i] = 1;
        }
    }

    // Count inversions on target to determine swaps needed
    Fenwick tree(n);
    long long swaps = 0;
    for (int i = 0; i < n; ++i) {
        swaps += i - tree.sum(target[i]);
        tree.add(target[i], 1);
    }
    return swaps;
}
#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...