제출 #829311

#제출 시각아이디문제언어결과실행 시간메모리
829311tranxuanbach자리 배치 (IOI18_seats)C++17
25 / 100
4089 ms73544 KiB
#include "seats.h"

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

constexpr int inf = 1e9 + 7;

struct segment_tree{
	static pair <int, int> merge(const pair <int, int>& lhs, const pair <int, int>& rhs){
		return pair{min(lhs.first, rhs.first), max(lhs.second, rhs.second)};
	}

	static constexpr auto unit = pair{inf, -inf};
	vector <pair <int, int>> seg;

	segment_tree(){ }

	segment_tree(int n){
		int sz = 1;
		while (sz < n * 2){
			sz *= 2;
		}
		seg.assign(sz, unit);
	}

	void build(int id, int l, int r, const vector <int>& a){
		if (l == r){
			seg[id] = pair{a[l], a[l]};
			return;
		}
		int mid = (l + r) >> 1;
		build(id * 2, l, mid, a);
		build(id * 2 + 1, mid + 1, r, a);
		seg[id] = merge(seg[id * 2], seg[id * 2 + 1]);
	}

	void update(int id, int l, int r, int i, int x){
		if (l == r){
			seg[id] = pair{x, x};
			return;
		}
		int mid = (l + r) >> 1;
		if (i <= mid){
			update(id * 2, l, mid, i, x);
		}
		else{
			update(id * 2 + 1, mid + 1, r, i, x);
		}
		seg[id] = merge(seg[id * 2], seg[id * 2 + 1]);
	}

	pair <int, int> query(int id, int l, int r, int u, int v){
		if (v < l or r < u){
			return unit;
		}
		if (u <= l and r <= v){
			return seg[id];
		}
		int mid = (l + r) >> 1;
		return merge(query(id * 2, l, mid, u, v), query(id * 2 + 1, mid + 1, r, u, v));
	}
};

struct bounding_rectangle{
	int lx = inf, rx = -inf, ly = inf, ry = -inf;

	void insert(int x, int y){
		lx = min(lx, x);
		rx = max(rx, x);
		ly = min(ly, y);
		ry = max(ry, y);
	}

	int area(){
		return (rx - lx + 1) * (ry - ly + 1);
	}
};

int n, m;
vector <int> pos_x, pos_y;

segment_tree seg_x, seg_y;

void give_initial_chart(int _n, int _m, vector <int> _r, vector <int> _c){
	n = _n;
	m = _m;
	pos_x.resize(n * m);
	pos_y.resize(n * m);
	for (int val = 0; val < n * m; val++){
		int x = _r[val], y = _c[val];
		pos_x[val] = x;
		pos_y[val] = y;
	}
	seg_x = segment_tree(n * m);
	seg_x.build(1, 0, n * m - 1, pos_x);
	seg_y = segment_tree(n * m);
	seg_y.build(1, 0, n * m - 1, pos_y);
}

int swap_seats(int val1, int val2){
	{
		int x1 = pos_x[val1], x2 = pos_x[val2];
		swap(pos_x[val1], pos_x[val2]);
		int y1 = pos_y[val1], y2 = pos_y[val2];
		swap(pos_y[val1], pos_y[val2]);
		seg_x.update(1, 0, n * m - 1, val1, x2);
		seg_x.update(1, 0, n * m - 1, val2, x1);
		seg_y.update(1, 0, n * m - 1, val1, y2);
		seg_y.update(1, 0, n * m - 1, val2, y1);
	}
	int ans = 0;
	int ptr = 0;
	while (ptr < n * m){
		auto [lx, rx] = seg_x.query(1, 0, n * m - 1, 0, ptr);
		auto [ly, ry] = seg_y.query(1, 0, n * m - 1, 0, ptr);
		if ((rx - lx + 1) * (ry - ly + 1) == ptr + 1){
			ans++;
			ptr++;
		}
		else{
			ptr = (rx - lx + 1) * (ry - ly + 1) - 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...