题目:题目链接

思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话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. linux-ubuntu下调出中文输入法

    linux-ubuntu下调出中文输入法 注:此方法我并没有亲身实践过,只是觉得可能会用到,所以保存一下

  2. CS round--36

    https://csacademy.com/contest/round-36/summary/ C题是一个贪心,最坏情况是,一开始肯定是每一对袜子都抽一个,然后就需要N个袜子了.后面的情况就是相同的了 ...

  3. hbase按照时间戳删除记录

    1.按照时间戳范围查询记录 echo "scan 'event_log', { COLUMN => 'cf:sid', TIMERANGE => [1466265600272, ...

  4. Hadoop体系结构

    在前面的博文中,我已经介绍过Hadoop的基本概念了(见博文初识Hadoop),今天来介绍一下Hadoop的体系结构. Hadoop的两大核心是HDFS和MapReduce,而整个Hadoop的体系结 ...

  5. springboot启动提示缺少数据源

    If you want an embedded database please put a supported one on the classpath. If you have database s ...

  6. Fedora12下yum安装低版本gcc

    1.Fedora12下gcc位置及其版本如下: 2.根据需要,要安装低版本的gcc,直接用"yum install gcc"安装时默认是安装最新版本的gcc,如下: 3.可先通过& ...

  7. 获取jqGrid中选择的行的数据

    下面可以获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id: var id=$(‘#gridTable’).jqGrid(‘getGridParam’,'selrow’); 如果想要 ...

  8. RHEL/CentOS 7.X 安装笔记

    配置vim # 配置 vim 编辑器 yum install vim rm /usr/bin/vi ln -s /usr/bin/vim /usr/bin/vi vi /etc/vimrc # 开启语 ...

  9. AJPFX辨析GBK和UTF8的区别

    GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字符. UTF-8编码:它是一种全国家通过的一种编码,如果你的网站涉及到多 ...

  10. 关于使用mybatis的分页插件问题

    首先我需要导入架包 1.pagehelper 如果你是在mybatis中配置分页‘ 如下代码 <plugins> <plugin interceptor="com.gith ...