Submission #535171

#TimeUsernameProblemLanguageResultExecution timeMemory
535171christinelynnArranging Shoes (IOI19_shoes)C++17
100 / 100
267 ms212256 KiB
#include <bits/stdc++.h>
#define REP(v, i, j) for (long long v = i; v < j; v++)
#define FORI(v) for (auto i : v)
#define FORJ(v) for (auto j : v)

#define OUT(v, a)     FORI(v)           cout << i << a;
#define OUTS(v, a, b)          cout << v.size() << a;     OUT(v, b)
#define in(a, n)     REP(i, 0, n)     cin >> a[i];

#define SORT(v) sort(begin(v), end(v))
#define REV(v) reverse(begin(v), end(v))

#define pb push_back
#define fi first
#define se second

#define detachIO                          ios_base::sync_with_stdio(false);     cin.tie(0);                           cout.tie(0);

using namespace std;

typedef pair<long long, long long> pii;
typedef pair<pii, long long> piii;
typedef pair<pii, pii> piiii;

const long long MAXN = 200100;
long long tree[MAXN * 4];

void update(long long l, long long r, long long idx, long long pos, long long val)
{
    if (l == r)
    {
        tree[idx] += val;
        return;
    }

    long long m = (l + r) / 2;

    if (pos <= m)
        update(l, m, idx * 2, pos, val);
    else
        update(m + 1, r, idx * 2 + 1, pos, val);

    tree[idx] = tree[idx * 2] + tree[idx * 2 + 1];
}

long long get(long long l, long long r, long long idx, long long start, long long end)
{
    if (r < start || l > end)
        return 0;
    if (start <= l && r <= end)
        return tree[idx];
    long long m = (l + r) / 2;
    long long l1 = get(l, m, idx * 2, start, end);
    long long l2 = get(m + 1, r, idx * 2 + 1, start, end);
    return l1 + l2;
}

queue<long long> mp[300000];

long long count_swaps(vector<int> v)
{
    memset(tree, 0, sizeof tree);

    long long ans = 0;

    REP(i, 0, v.size())
    {
        update(0, v.size() - 1, 1, i, 1);
        if (mp[v[i] + 110000].size())
        {
            auto &q = mp[v[i] + 110000];
            auto x = q.front();
            ans += i - x;
            if ((x - i) != 1)
                ans -= get(0, v.size() - 1, 1, x + 1, i - 1);
            if (v[i] > 0)
                ans--;
            update(0, v.size() - 1, 1, i, -1);
            update(0, v.size() - 1, 1, x, -1);
            q.pop();
        }
        else
            mp[-v[i] + 110000].push(i);
    }

    return ans;
}

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:2:46: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    2 | #define REP(v, i, j) for (long long v = i; v < j; v++)
......
   66 |     REP(i, 0, v.size())
      |         ~~~~~~~~~~~~~~                        
shoes.cpp:66:5: note: in expansion of macro 'REP'
   66 |     REP(i, 0, v.size())
      |     ^~~
#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...