Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MAXN = 1010;
- const int ue = 2e6;
- int grid[MAXN][MAXN], mark[MAXN], p[ue];
- int X1[MAXN], Y1[MAXN], X2[MAXN], Y2[MAXN];
- int move_x[4] = {0, 0, -1, +1};
- int move_y[4] = {-1, +1, 0, 0};
- bool vis[MAXN][MAXN];
- int cnt = 0;
- int n, m, q;
- bool valid(int x, int y) {
- if (x <= 0 || y <= 0 || x > n || y > m || vis[x][y] || grid[x][y] > 0) return false;
- return true;
- }
- int id(int x, int y) {
- return x * 1001 + y;
- }
- void dfs(int x, int y) {
- vis[x][y] = true;
- p[id(x, y)] = cnt;
- for (int i = 0; i < 4; i++) {
- int dx = x + move_x[i], dy = y + move_y[i];
- if (valid(dx, dy)) dfs(dx, dy);
- }
- }
- int find(int a) {
- if (p[a] == a) return a;
- return p[a] = find(p[a]);
- }
- void merge(int a, int b) {
- a = find(a);
- b = find(b);
- p[a] = b;
- }
- void clear() {
- for (int i = 0; i < ue; i++) {
- p[i] = i;
- }
- for (int i = 0; i <= n + 1; i++) {
- grid[i][0] = ue;
- grid[i][m + 1] = ue;
- }
- for (int i = 0; i <= m + 1; i++) {
- grid[0][i] = ue;
- grid[n + 1][i] = ue;
- }
- }
- int main() {
- //ios::sync_with_stdio(0); cin.tie(0);
- cin >> n >> m >> q;
- clear();
- for (int i = 0; i < q; i++) {
- cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
- if (X1[i] == X2[i]) {
- for (int j = Y1[i]; j <= Y2[i]; j++) {
- grid[X1[i]][j]++;
- }
- }
- if (Y1[i] == Y2[i]) {
- for (int k = X1[i]; k <= X2[i]; k++) {
- grid[k][Y1[i]]++;
- }
- }
- }
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- if (!vis[i][j] && grid[i][j] == 0) {
- dfs(i, j);
- cnt++;
- }
- }
- }
- int last_cnt = cnt;
- vector<int> ans(q);
- ans[q] = cnt;
- set<int> st;
- for (int i = q - 1; i >= 0; i--) {
- st.clear();
- cout << "EM -> " << i << '\n';
- if (X1[i] == X2[i]) {
- for (int j = Y1[i]; j <= Y2[i]; j++) {
- grid[X1[i]][j]--;
- if (grid[X1[i]][j - 1] == 0) {
- p[id(X1[i],j)] = find(id(X1[i], j - 1));
- }
- else {
- p[id(X1[i],j)] = last_cnt++;
- cnt++;
- }
- st.insert(find(id(X1[i], j)));
- }
- for (int j = Y1[i]; j <= Y2[i]; j++) {
- if (grid[X1[i]][j]) continue;
- int id1 = id(X1[i] - 1, j);
- int id2 = id(X1[i] + 1, j);
- if (!grid[X1[i] - 1][j] && !grid[X1[i] + 1][j]) {
- st.insert(find(id1));
- st.insert(find(id2));
- }
- }
- }
- if (Y1[i] == Y2[i]) {
- for (int k = X1[i]; k <= X2[i]; k++) {
- grid[k][Y1[i]]--;
- if (grid[k - 1][Y1[i]] == 0) {
- merge(id(k, Y1[i]), id(k - 1, Y1[i]));
- }
- else {
- p[id(k, Y1[i])] = last_cnt++;
- cnt++;
- }
- st.insert(find(id(k, Y1[i])));
- }
- for (int k = X1[i]; k <= X2[i]; k++) {
- if (grid[k][Y1[i]]) continue;
- int id1 = id(k, Y1[i] - 1);
- int id2 = id(k, Y1[i] + 1);
- if (!grid[k][Y1[i] - 1] && !grid[k][Y1[i] + 1]) {
- st.insert(find(id1));
- st.insert(find(id2));
- }
- }
- }
- int curr = *st.begin();
- for (auto x : st) {
- if (find(curr) != find(x)) {
- merge(curr, x);
- cout << "aq\n";
- cnt--;
- }
- }
- cout << "CNT = " << cnt << '\n';
- cout << "SIZE = " << st.size() << '\n';
- //cnt -= st.size();
- ans[i] = cnt;
- }
- cout << "-----\n";
- for (int i = 1; i <= q; i++) {
- cout << ans[i] << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement