제출 #1332811

#제출 시각아이디문제언어결과실행 시간메모리
1332811gelastropodArranging Shoes (IOI19_shoes)C++20
45 / 100
129 ms99224 KiB
#include "shoes.h"

#include <bits/stdc++.h>
using namespace std;
#define int long long

struct node {
	int s, e, m, v;
	node* l, * r;

	node(int _s, int _e) : s(_s), e(_e), m((_s + _e) / 2), v(0) {
		if (s != e)
			l = new node(s, m),
			r = new node(m + 1, e);
	}

	void upd(int n, int x) {
		if (s == e) {
			v += x;
			return;
		}
		if (n <= m) l->upd(n, x);
		else r->upd(n, x);
		v = l->v + r->v;
	}

	int qry(int a, int b) {
		if (b < s || a > e) return 0;
		if (a <= s && b >= e) return v;
		return l->qry(a, b) + r->qry(a, b);
	}
} *root;

long long count_swaps(std::vector<signed> s) {
	int N = s.size() / 2;
	root = new node(0, 2 * N);
	vector<queue<int>> things(N + 1, queue<int>());
	vector<int> state(N + 1, 0);
	vector<pair<int, int>> pairs;
	for (int i = 0; i < 2 * N; i++) {
		if (s[i] > 0) {
			if (state[s[i]] == -1) {
				pairs.push_back(pair<int, int>(things[s[i]].front(), i));
				things[s[i]].pop();
				if (things[s[i]].empty()) state[s[i]] = 0;
			}
			else {
				things[s[i]].push(i);
				state[s[i]] = 1;
			}
		}
		else {
			if (state[-s[i]] == 1) {
				pairs.push_back(pair<int, int>(i, things[-s[i]].front()));
				things[-s[i]].pop();
				if (things[-s[i]].empty()) state[-s[i]] = 0;
			}
			else {
				things[-s[i]].push(i);
				state[-s[i]] = -1;
			}
		}
	}
	sort(pairs.begin(), pairs.end());
	vector<int> goal(2 * N, 0);
	for (int i = 0; i < N; i++) {
		goal[pairs[i].first] = 2 * i;
		goal[pairs[i].second] = 2 * i + 1;
	}
	int ans = 0;
	for (int i = 0; i < 2 * N; i++) {
		ans += root->qry(goal[i] + 1, 2 * N);
		root->upd(goal[i], 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...