Submission #705204

#TimeUsernameProblemLanguageResultExecution timeMemory
705204stoyan_malininArranging Shoes (IOI19_shoes)C++14
100 / 100
280 ms148900 KiB
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<set>

using namespace std;

const int MAXN = 1e5;

struct FenwickTree
{
    int tree[MAXN * 2 + 5];

    FenwickTree()
    {
        memset(this->tree, 0, sizeof(this->tree));
    }

    void update(int index, int value)
    {
        index++;
        while (index < MAXN*2 + 5)
        {
            tree[index] += value;
            index += index&(-index);
        }
    }

    int query(int index)
    {
        int sum = 0;

        index++;
        while (index>0)
        {
            sum += tree[index];
            index -= index&(-index);
        }

        return sum;
    }
};

FenwickTree *T = new FenwickTree();
queue <int> leftShoes[MAXN + 5], rightShoes[MAXN + 5];

int calcValue(int leftShoeInd, int rightShoeInd)
{
    int val = leftShoeInd + (rightShoeInd - 1);
    if (leftShoeInd > rightShoeInd) val++;

    return val;
}

int64_t count_swaps(vector <int> s)
{
    set <int> allIndexes;
    for (int i = 0;i<s.size();i++)
    {
        allIndexes.insert(i);

        if (s[i] < 0) leftShoes[ -s[i] ].push(i);
        else rightShoes[ s[i] ].push(i);
    }

    int64_t answer = 0;
    for (int index = 0; index < s.size(); index += 2)
    {
        int bestIndex = -1;
        int leftShoeFakeInd, rightShoeFakeInd;

        bestIndex = abs(s[*allIndexes.begin()]);
        allIndexes.erase(leftShoes[bestIndex].front());
        allIndexes.erase(rightShoes[bestIndex].front());

        leftShoeFakeInd = leftShoes[bestIndex].front() - T->query(leftShoes[bestIndex].front());
        rightShoeFakeInd = rightShoes[bestIndex].front() - T->query(rightShoes[bestIndex].front());

        T->update(leftShoes[bestIndex].front(), 1);
        T->update(rightShoes[bestIndex].front(), 1);

        leftShoes[bestIndex].pop();
        rightShoes[bestIndex].pop();

        answer += calcValue(leftShoeFakeInd, rightShoeFakeInd);
    }

    return answer;
}

Compilation message (stderr)

shoes.cpp: In function 'int64_t count_swaps(std::vector<int>)':
shoes.cpp:59:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     for (int i = 0;i<s.size();i++)
      |                    ~^~~~~~~~~
shoes.cpp:68:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     for (int index = 0; index < s.size(); index += 2)
      |                         ~~~~~~^~~~~~~~~~
#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...