제출 #829280

#제출 시각아이디문제언어결과실행 시간메모리
829280tranxuanbachSeats (IOI18_seats)C++17
17 / 100
4088 ms110156 KiB
#include "seats.h"

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

constexpr int inf = 1e9 + 7;

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 <vector <int>> a;

vector <pair <int, int>> pos;

int ans;
vector <bounding_rectangle> b;

void give_initial_chart(int _n, int _m, vector <int> _r, vector <int> _c){
	n = _n;
	m = _m;
	a.assign(n, vector <int>(m));
	pos.resize(n * m);
	for (int val = 0; val < n * m; val++){
		int x = _r[val], y = _c[val];
		a[x][y] = val;
		pos[val] = pair{x, y};
	}

	ans = 0;
	b.resize(n * m + 1);
	for (int val = 0; val < n * m; val++){
		b[val + 1] = b[val];
		b[val + 1].insert(pos[val].first, pos[val].second);
		if (b[val + 1].area() == val + 1){
			ans++;
		}
	}
}

int swap_seats(int val1, int val2){
	if (val1 > val2){
		swap(val1, val2);
	}
	{
		auto [x1, y1] = pos[val1];
		auto [x2, y2] = pos[val2];
		swap(a[x1][y1], a[x2][y2]);
		swap(pos[val1], pos[val2]);
	}
	for (int val = val1; val < val2; val++){
		if (b[val + 1].area() == val + 1){
			ans--;
		}
		b[val + 1] = b[val];
		b[val + 1].insert(pos[val].first, pos[val].second);
		if (b[val + 1].area() == val + 1){
			ans++;
		}
	}
	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...