Submission #76082

#TimeUsernameProblemLanguageResultExecution timeMemory
76082arockSeats (IOI18_seats)C++14
33 / 100
1791 ms80548 KiB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;

int H, W;
vector<int> R, C;

struct seg {
	int min, ans;
} tree[4 * 1000 * 1000];
vector<int> rev;
int lazy[4 * 1000 * 1000];

seg merge(seg a, seg b) {
	if (a.min < b.min) {
		return a;
	} else if(b.min < a.min) {
		return b;
	} else {
		return {a.min, a.ans + b.ans};
	}
}

seg build(int cur, int lo, int hi) {
	if (lo == hi) {
		return tree[cur] = {0, 1};
	}

	int lmid = (lo + hi) / 2, rmid = lmid + 1;
	return merge(build(cur << 1 | 0, lo, lmid),
		         build(cur << 1 | 1, rmid, hi));
}

void update(int l, int r, int delta, int cur, int lo, int hi) {

	if (lo == l && hi == r) {
		lazy[cur]     += delta;
		tree[cur].min += delta;
	} else {

		lazy[cur << 1 | 0] += lazy[cur];
		tree[cur << 1 | 0].min += lazy[cur];
		lazy[cur << 1 | 1] += lazy[cur];
		tree[cur << 1 | 1].min += lazy[cur];
		lazy[cur] = 0;

		int lmid = (lo + hi) / 2, rmid = lmid + 1;
		if (l <= lmid) {
			update(l, min(r, lmid), delta, cur << 1 | 0, lo, lmid);
		}
		if (r >= rmid) {
			update(max(l, rmid), r, delta, cur << 1 | 1, rmid, hi);
		}

		tree[cur] = merge(tree[cur << 1 | 0],
			              tree[cur << 1 | 1]);
	}
}

void update(int l, int r, int delta) {
	update(l + 1, r, delta, 1, 1, H * W);
}

void give_initial_chart(int HH, int WW, vector<int> RR, vector<int> CC) {

	H = HH, W = WW, R = RR, rev = CC;

	C.resize(H * W + 2);
	C[0] = H * W;
	for (int i = 0; i < H * W; i++) {
		C[rev[i] + 1] = i;
	}
	C[H * W + 1] = H * W;

	build(1, 1, H * W);

	for (int i = 0; i <= H * W; i++) {
		update(min(C[i], C[i + 1]), max(C[i], C[i + 1]), +1);
	}
}


int swap_seats(int a, int b) {

	int ta = a, tb = b;

	a = rev[a] + 1, b = rev[b] + 1;

	update(min(C[a], C[a - 1]), max(C[a], C[a - 1]), -1);
	update(min(C[a], C[a + 1]), max(C[a], C[a + 1]), -1);
	update(min(C[b], C[b - 1]), max(C[b], C[b - 1]), -1);
	update(min(C[b], C[b + 1]), max(C[b], C[b + 1]), -1);

	swap(C[a], C[b]);
	swap(rev[ta], rev[tb]);

	update(min(C[a], C[a - 1]), max(C[a], C[a - 1]), +1);
	update(min(C[a], C[a + 1]), max(C[a], C[a + 1]), +1);
	update(min(C[b], C[b - 1]), max(C[b], C[b - 1]), +1);
	update(min(C[b], C[b + 1]), max(C[b], C[b + 1]), +1);

	return tree[1].min == 2? tree[1].ans : 0;
}
#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...