题目:题目链接

思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话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. net core分块上传文件

    net core分块上传文件   写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...( ...

  2. (转)io优化

    原文:http://blog.csdn.net/gzh0222/article/details/9227393 1.系统学习 IO性能对于一个系统的影响是至关重要的.一个系统经过多项优化以后,瓶颈往往 ...

  3. TDH-search汇报理解

    题目:海量数据查询开头:1.自我介绍:2.题目切入: 什么是海量数据查询?(海量数据,快速,符合要求) 几个常用场景(搜索引擎,百度:话单查询:影像平台,高铁)3.展示目录:架构,案例,平台规划 4. ...

  4. SpringCloud 分布式配置中心

    SpringCloud 分布式配置中心 服务端 创建工程并完善结构 国际惯例,把maven工程创建完善 pom.xml <?xml version="1.0" encodin ...

  5. sqlsever 判断某个字段出现重复的字母或字符

    -------下面使用标量值函数判断  出现重复的个数 create function fn_str_times(@str varchar(1000),--原子符串@indexstr varchar( ...

  6. vue2.0:(八-2)、外卖App弹窗部分sticky footer

    什么是sticky-footer ? 如果页面内容不够长的时候,页脚块粘贴在视窗底部,如果内容足够长时,页脚块会被内容向下推送.那具体要怎么做呢?下面以外卖App为例: 第一种方法:这个自己用过,是好 ...

  7. 【虚拟机-网络IP】如何开放 Azure 虚拟机 Ping 功能

    前言 文章<使用 PsPing & PaPing 进行 TCP 端口连通性测试>中提到,ICMP 协议的数据包无法通过 Azure 的防火墙和负载均衡器,所以不能直接使用 Ping ...

  8. Caused by: java.lang.ClassNotFoundException: org.springframework.web.socket.server.standard.ServerEndpointExporter

    Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/web/socket/ ...

  9. BestCoder Round #56 1002 Clarke and problem 1003 Clarke and puzzle (dp,二维bit或线段树)

    今天第二次做BC,不习惯hdu的oj,CE过2次... 1002 Clarke and problem 和Codeforces Round #319 (Div. 2) B Modulo Sum思路差不 ...

  10. Spring boot 配置异步处理执行器

    示例如下: 1. 新建Maven 项目 async-executor 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...