题目:题目链接

思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话dfs会爆栈,判断过于复杂也会导致超时,我们采用离线反向操作,先全部涂好,然后把黑格子逐步涂白,我们把每个空白区域当作一个并查集,然后采用合并并查集的方法来做,好困啊,明天还有课,具体思路有空再写吧,先睡觉了。

AC代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std; #define y1 yy1
#define y2 _y2 const int maxn = + ;
const int maxq = + ; int grid[maxn][maxn], x1[maxq], y1[maxq], x2[maxq], y2[maxq], num[maxn * maxn], n, m, q, sum, ans[maxq]; int cx[] = { -, , , };
int cy[] = { , -, , }; void init();
int cal(int, int);
bool judge(int, int);
void unite(int, int);
int _find(int);
void solve(); int main()
{
ios::sync_with_stdio();
cin.tie(); cin >> n >> m >> q; for (int i = ; 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];
else
for (int j = x1[i]; j <= x2[i]; ++j)
++grid[j][y1[i]];
} init(); solve(); for (int i = ; i <= q; ++i)
cout << ans[i] << endl; return ;
} void init() {
for (int i = ; i <= n * m; ++i)
num[i] = i; sum = n * m; for (int i = ; i <= n; ++i) {
for (int j = ; j <= m; ++j) {
if (!grid[i][j]) {
for (int k = ; k < ; ++k) {
if (judge(i + cx[k], j + cy[k]) && !grid[i + cx[k]][j + cy[k]]) {
unite(cal(i, j), cal(i + cx[k], j + cy[k]));
}
}
}
else
--sum;
}
}
} int cal(int x, int y) {
return (x - ) * m + y;
} bool judge(int x, int y) {
return x > && x <= n && y > && y <= m;
} void unite(int x, int y) {
int a = _find(x), b = _find(y);
if (a == b)
return; --sum;
num[a] = b;
} int _find(int x) {
return x == num[x] ? x : num[x] = _find(num[x]);
} void solve() {
for (int i = q; i > ; --i) {
ans[i] = sum;
if (x1[i] == x2[i]) {
for (int j = y1[i]; j <= y2[i]; ++j) {
--grid[x1[i]][j];
if (!grid[x1[i]][j]) {
++sum;
for (int k = ; k < ; ++k) {
if (judge(x1[i] + cx[k], j + cy[k]) && !grid[x1[i] + cx[k]][j + cy[k]])
unite(cal(x1[i], j), cal(x1[i] + cx[k], j + cy[k]));
}
}
}
}
else {
for (int j = x1[i]; j <= x2[i]; ++j) {
--grid[j][y1[i]];
if (!grid[j][y1[i]]) {
++sum;
for (int k = ; k < ; ++k)
if (judge(j + cx[k], y1[i] + cy[k]) && !grid[j + cx[k]][y1[i] + cy[k]])
unite(cal(j, y1[i]), cal(j + cx[k], y1[i] + cy[k]));
}
}
}
}
}

Artwork Gym - 101550A 离线并查集的更多相关文章

  1. [bzoj1015](JSOI2008)星球大战 starwar(离线+并查集)

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武 器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...

  2. ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs && 离线 && 并查集)

    http://hihocoder.com/problemset/problem/1291 前几天比较忙,这次来补一下微软笔试的最后一题,这题是这次微软笔试的第四题,过的人比较少,我当时在调试B题,没时 ...

  3. HDU5441 Travel 离线并查集

    Travel Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, ...

  4. [USACO18FEB] Snow Boots G (离线+并查集)

    题目大意:略 网上各种神仙做法,本蒟蒻只想了一个离线+并查集的做法 对所有靴子按最大能踩的深度从大到小排序,再把所有地砖按照积雪深度从大到小排序 一个小贪心思想,我们肯定是在 连续不能踩的地砖之前 的 ...

  5. Codeforces Gym 100463E Spies 并查集

    Spies Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Desc ...

  6. 【杭电OJ3938】【离线+并查集】

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  7. BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)

    似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...

  8. 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)

    Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...

  9. 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...

随机推荐

  1. D、Homework of PE 容斥原理

    https://scut.online/p/113 终于想懂了这个容斥, 华工4月23号校赛,考虑总的所有情况,设1---n里面含有质数的个数为all,需要固定m个质数.那么有 totSum = C( ...

  2. Spring-boot原理(附带实现一个spring-boot-starter实例和代码下载)

    ​ (我就是个封面) Spring-boot自出现后,到现在火的很,大家貌似都在用,连招聘里面也要求会这个.但是说实话,spring-boot无外乎想实现一种可插拔的编程方式,说是简化配置,其实并没有 ...

  3. AXURE-手把手教你做汉化

    ​ 我们默认下载的AXURE是英文版的,对于英文能力不足或者不习惯英文界面的,那必须使用汉化手段,网上也有很多朋友已经为大家做好了汉化文件,这里介绍一下如何自己做AXURE的汉化. 如何开始汉化 如何 ...

  4. 01SpringBase

    Spring (容器) 概述: 01.Java EE开发者的春天 02.主要目的是 降低业务逻辑层和其他层的耦合度 IOC 03.spring容器是用来创建(new)和管理(对象之间的关系)程序中所有 ...

  5. Java @Validated 遇到的大坑

    我在一个Controller内,在两个方法内使用@Validated,这是两个POST方法会进入的方法,这两个方法的实体类的命名(下图红框内容)不能一样,一样的话就会导致第二个在页面显示不出来错误信息 ...

  6. 滚动条美化插件 nicescroll

    这个插件使用起来非常简单,首先下载插件jquery.nicescroll.min.js 然后在页面中引入jquery,再引入这个插件, 然后在页面中需要修改滚动条的地方,例如id为box的div &l ...

  7. JavaBean+jsp开发模式 --结合form表单 实例

    1.创建form表单 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  8. eclipse、idea安装lombok插件

    今天新项目中,用到了lombok知识,很方便. 但是使用之前,需要在eclipse.idea中安装插件才可以使用,配置如下.  一:在开发工具中安装插件: Eclipse: 下载地址:https:// ...

  9. ApexSQL Log中的Redo Script跟原始SQL不一致问题

    最近遇到一个误更新数据的问题,使用ApexSQL Log做挖掘事务日志的时候,发现ApexSQL Log生成的Redo Script跟原始SQL是有区别的.它们并不是完全一致的.只是逻辑上等价而已.如 ...

  10. java面试题(杨晓峰)---第二讲Exception和Error有什么区别?

    本人总结: Exception和Error:正常问题和意外问题,以自行车举例:没气和爆胎. ①理解Throwable,Exception,Error的设计和分类. ②掌握哪些应用最广泛的子类, ③如何 ...