Submission #1170570

#TimeUsernameProblemLanguageResultExecution timeMemory
1170570wiiArranging Shoes (IOI19_shoes)C++20
0 / 100
33 ms67652 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

#define foru(i,a,b) for(int i = (a); i <= (b); ++i)
#define ford(i,a,b) for(int i = (a); i >= (b); --i)

const int MaxN = 1e5 + 5;
queue<int> pos[MaxN];
int l[MaxN];

int f[MaxN];
void upd(int u, int x) {
    for (; u < MaxN; u += u & -u)
        f[u] += x;
}

int get(int u) {
    int ans = 0;
    for (; u > 0; u -= u & -u)
        ans += f[u];
    return ans;
}

int get(int l, int r) {
    return get(r) - get(l - 1);
}

long long count_swaps(std::vector<int> s) {
    int n = s.size();

    return n * (n - 1) / 2;

	for (int i = 1; i <= n; ++i) {
        int v = s[i - 1];

        if (!pos[abs(v)].empty()) {
            int j = pos[abs(v)].front();
            if (s[j - 1] + v == 0) {
                pos[abs(v)].pop();
                l[j] = i;
            } else {
                pos[abs(v)].push(i);
            }
        } else {
            pos[abs(v)].push(i);
        }
	}

	int ans = 0;
    foru(i, 1, n) if (l[i]) {
        int j = l[i];

        int r = (j - i - 1) - get(i + 1, j - 1);
        ans += r;
        ans += (s[i - 1] > s[j - 1]);

        // cout << i << " " << j << " " << r + (s[i - 1] > s[j - 1]) << endl;

        upd(j, 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...