Submission #615511

#TimeUsernameProblemLanguageResultExecution timeMemory
615511Mohammed_AtalahArranging Shoes (IOI19_shoes)C++17
100 / 100
178 ms34156 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

struct segtree {

	int size = 1;
	vector<int> sums;

	void init(int n) {
		while (size < n) {
			size *= 2;
		}
		sums.assign(2 * size, 0);
	}

	void build(vector<int> &v, int x, int lx, int rx) {
		if (rx - lx == 1) {
			if (lx  < v.size()) {
				sums[x] = v[lx];
			}
			return;
		}
		int m = (lx + rx) / 2;
		build(v, 2 * x + 1, lx, m);
		build(v, 2 * x + 2, m, rx);
		sums[x] = sums[2 * x + 2] + sums[2 * x + 1];
	}

	void build(vector<int> &v) {
		build(v, 0, 0, size);
	}

	void set(int i, int v, int x, int lx, int rx) {
		if (rx - lx == 1) {
			sums[x] = v;
			return;
		}

		int m = (lx + rx) / 2;

		if (i < m) {
			set(i, v, x * 2 + 1, lx, m);
		} else {
			set(i, v, x * 2 + 2, m, rx);
		}

		sums[x] = sums[x * 2 + 1] + sums[x * 2 + 2];
	}

	void set(int i, int v) {
		set(i, v, 0, 0, size);
	}


	int sum (int l, int r, int x, int lx, int rx) {
		if (rx <= l || r <= lx )return 0 ;
		if (l <= lx && rx <= r) return sums[x];
		int m = (rx + lx) / 2;
		int n1 = sum(l, r, x * 2 + 1, lx, m );
		int n2 = sum(l, r, x * 2 + 2, m, rx );
		return n1 + n2;

	}

	int sum(int l, int r) {
		return sum(l, r, 0, 0, size);
	}

};


long long count_swaps(std::vector<int> s) {
	int n = s.size();
	vector<set<int>> left(n + 1);
	vector<set<int>> right(n + 1);
	vector<int> vis(n);
	for (int i = 0; i < n ; i++) {
		if (s[i] < 0) {
			left[abs(s[i])].insert(i);
		} else {
			right[abs(s[i])].insert(i);
		}
	}
	segtree st;
	st.init(n);
	long long result = 0;

	for (int i = 0; i < n; i++) {
		if (vis[i]) continue;
		if (s[i] < 0) {
			auto it  = right[abs(s[i])].lower_bound(i);
			result += *it - i;
			result--;
			result -= st.sum(i, *it);
			st.set(*it, 1);
			vis[*it] = 1;
			right[abs(s[i])].erase(it);
		} else {
			auto it  = left[abs(s[i])].lower_bound(i);
			result += *it - i;

			result -= st.sum(i, *it);
			st.set(*it, 1);
			vis[*it] = 1;
			left[abs(s[i])].erase(it);
		}
	}


	return result;
}

Compilation message (stderr)

shoes.cpp: In member function 'void segtree::build(std::vector<int>&, int, int, int)':
shoes.cpp:19:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |    if (lx  < 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...