题目:题目链接

思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话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. (转)mysqldump: Got error: 1556: You can't use locks with log tables.

    mysqldump: Got error: 1556: You can't use locks with log tables. 原文:http://blog.51cto.com/oldboy/112 ...

  2. 下一代的前端构建工具:parcel打包react

    1. parcel很受欢迎,webpack太慢了,试试Parcel下一代的前端构建工具 2.Parcel很快,但缺少好多插件,没有base64,没有办法拆分打包文件.... 3.总结:适合小项目 4. ...

  3. Python使用selenium进行爬虫(一)

    JAVA爬虫框架很多,类似JSOUP,WEBLOGIC之类的爬虫框架都十分好用,个人认为爬虫的大致思路就是: 1.挑选需求爬的URL地址,将其放入需求网络爬虫的队列,也可以把爬到的符合一定需求的地址放 ...

  4. 解决Mysql导入大数据出现gone away的问题

    在用Mysql Yog或者PHPMyadmin等工具导入数据量大的sql文件时,会提示“gone away”,那么如何处理这个问题尼? 在Mysql对应的配置文件中my.ini文件中加入以下配置: # ...

  5. Layer:如何调用layer.open打开的的iframe窗口中的JS?

    layer.open({type: 2,content: 'test/iframe.html',success: function(layero, index){ var body = layer.g ...

  6. Python+selenium整合自动发邮件功能

    主要实现的目的是:自动将测试报告以邮件的形式通知相关人员 from HTMLTestRunner import HTMLTestRunner import HTMLTestReport from em ...

  7. JavaScript_6_函数

    函数是由事件驱动的或者当它被调用执行的可重复使用的代码块 调用带参数的函数 带有返回值的函数 <!DOCTYPE html> <html> <head> <t ...

  8. 洛谷 U3348 A2-回文数

    题目背景 方方方很喜欢回文数,于是就有了一道关于回文数的题目. 题目描述 求从小到大第n(1<=n<=10^18)个回文数. 注释:出题人认为回文数不包括0. 输入输出格式 输入格式: 一 ...

  9. SAP Cloud for Customer客户主数据的地图集成

    点击这个按钮可以通过地图的方式查看C4C客户在地图上的地理位置: 只需要在这个客户的地址栏里维护上天府软件园的经度和维度: 就能够在C4C的客户列表页面里显示该客户在地图上的位置: 要获取更多Jerr ...

  10. CF Gym 100187D Holidays (数学,递推)

    题意:给n个元素,从n中选两个非空集合A和B.问有多少中选法? 递推: dp[n]表示元素个数为n的方案数,对于新来的一个元素,要么加入集合,要么不加入集合自成一个集合.加入集合有三种选择,A,B,E ...