Submission #1165170

#TimeUsernameProblemLanguageResultExecution timeMemory
1165170chikien2009Arranging Shoes (IOI19_shoes)C++20
100 / 100
139 ms139832 KiB
#include <bits/stdc++.h>
#include "shoes.h"

using namespace std;

// inline void setup()
// {
// #ifndef ONLINE_JUDGE
//     freopen("test.inp", "r", stdin);
//     freopen("test.out", "w", stdout);
// #endif
//     ios_base::sync_with_stdio(0);
//     cin.tie(0);
//     cout.tie(0);
// }

class FENWICK_TREE
{
private:
    long long tree_size;
    vector<long long> tree;

public:
    FENWICK_TREE(long long new_size)
    {
        tree_size = new_size;
        tree.resize(tree_size + 1, 0);
    }
    void Update(long long pos, long long val)
    {
        while (pos <= tree_size)
        {
            tree[pos] += val;
            pos += pos & (~(pos - 1));
        }
    }
    long long Get(long long pos)
    {
        long long res = 0;
        while (0 < pos)
        {
            res += tree[pos];
            pos -= pos & (~(pos - 1));
        }
        return res;
    }
};

long long count_swaps(vector<int> S)
{
    int a;
    long long res = 0;
    queue<long long> neg[S.size() / 2 + 1], pos[S.size() / 2 + 1];
    FENWICK_TREE ft(S.size());
    S.insert(S.begin(), 0);
    for (long long i = 1; i < S.size(); ++i)
    {
        if (S[i] < 0)
        {
            neg[-S[i]].push(i);
        }
        else
        {
            pos[S[i]].push(i);
        }
    }
    for (long long i = 1, j = 1; i < S.size(); ++i)
    {
        if (S[i] == 0)
        {
            continue;
        }
        if (S[i] < 0)
        {
            a = pos[-S[i]].front();
            res += a - i - (ft.Get(a) - ft.Get(i - 1)) - 1;
        }
        else
        {
            a = neg[S[i]].front();
            res += a - i - (ft.Get(a) - ft.Get(i - 1));
        }
        S[a] = 0;
        ft.Update(a, 1);
        pos[abs(S[i])].pop();
        neg[abs(S[i])].pop();
    }
    return res;
}

// int main()
// {
//     setup();

//     long long n;
//     vector<int> v;
//     cin >> n;
//     v.resize(n);
//     for (long long i = 0; i < n; ++i)
//     {
//         cin >> v[i];
//     }
//     cout << count_swaps(v);
//     return 0;
// }
#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...