Submission #1227769

#TimeUsernameProblemLanguageResultExecution timeMemory
1227769colossal_pepeArranging Shoes (IOI19_shoes)C++20
100 / 100
158 ms149936 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

struct SGT {
	int n;
	vector<ll> t, lazy;
	SGT(int _n) : n(_n) {
		t.resize(4 * n, 0), lazy.resize(4 * n, 0);
	}
	void push(int v) {
		t[2 * v] += lazy[v];
		lazy[2 * v] += lazy[v];
		t[2 * v + 1] += lazy[v];
		lazy[2 * v + 1] += lazy[v];
		lazy[v] = 0;
	}
	void update(int v, int l, int r, int L, int R) {
		if (R < l or r < L) return;
		else if (L <= l and r <= R) t[v] += 1, lazy[v] += 1;
		else {
			push(v);
			int mid = (l + r) / 2;
			update(2 * v, l, mid, L, R);
			update(2 * v + 1, mid + 1, r, L, R);
			t[v] = t[2 * v] + t[2 * v + 1];
		}
	}
	ll query(int v, int l, int r, int i) {
		if (l == r) return t[v];
		else {
			push(v);
			int mid = (l + r) / 2;
			if (i <= mid) return query(2 * v, l, mid, i);
			else return query(2 * v + 1, mid + 1, r, i);
		}
	}
	void update(int L, int R) {
		update(1, 0, n - 1, L, R);
	}
	ll query(int x) {
		return query(1, 0, n - 1, x);
	}
};

ll n;
vector<queue<ll>> l, r;

ll count_swaps(vector<int> s) {
	n = s.size();
	l.resize((n / 2) + 1), r.resize((n / 2) + 1);
	SGT sgt = SGT(n);
	ll cnt = 0;
	for (int i = 0; i < n; i++) {
		int x = abs(s[i]);
		if (s[i] < 0) {
			if (not r[x].empty()) {
				cnt += i - (r[x].front() + sgt.query(r[x].front()));
				sgt.update(r[x].front(), i);
				r[x].pop();
			} else l[x].push(i);
		} else {
			if (not l[x].empty()) {
				cnt += i - (l[x].front() + sgt.query(l[x].front())) - 1;
				sgt.update(l[x].front(), i);
				l[x].pop();
			} else r[x].push(i);
		}
	}
	return cnt;
}
#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...