Artwork Gym - 101550A 离线并查集
题目:题目链接
思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话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 离线并查集的更多相关文章
- [bzoj1015](JSOI2008)星球大战 starwar(离线+并查集)
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武 器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...
- ACM学习历程—Hihocoder 1291 Building in Sandbox(dfs && 离线 && 并查集)
http://hihocoder.com/problemset/problem/1291 前几天比较忙,这次来补一下微软笔试的最后一题,这题是这次微软笔试的第四题,过的人比较少,我当时在调试B题,没时 ...
- HDU5441 Travel 离线并查集
Travel Problem Description Jack likes to travel around the world, but he doesn’t like to wait. Now, ...
- [USACO18FEB] Snow Boots G (离线+并查集)
题目大意:略 网上各种神仙做法,本蒟蒻只想了一个离线+并查集的做法 对所有靴子按最大能踩的深度从大到小排序,再把所有地砖按照积雪深度从大到小排序 一个小贪心思想,我们肯定是在 连续不能踩的地砖之前 的 ...
- Codeforces Gym 100463E Spies 并查集
Spies Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463/attachments Desc ...
- 【杭电OJ3938】【离线+并查集】
http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Time Limit: 2000/1000 MS (Java/Others) Memo ...
- BZOJ4551 Tjoi2016&Heoi2016树(离线+并查集)
似乎是弱化的qtree3.树剖什么的非常无脑.考虑离线.并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可. #include<iostream> #include& ...
- 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)
Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...
- 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 ...
随机推荐
- tomcat7 fail to start inside Ubuntu Docker container
The tomcat startup script needs some special privileges. Concrete it needs to check all running proc ...
- (转)Linxu磁盘体系知识介绍及磁盘介绍
Linxu磁盘体系知识介绍及磁盘介绍 系统管理 / 2017-01-14 / 0 条评论 / 浴春风 Linu磁盘设备基础知识指南磁盘速度快具备的条件: 1)主轴的转速5400/7200/10000/ ...
- Cube中维度排序-通过在数据仓库增加列来实现排序
数据仓库增加排序列: 维度设置: 正确结果:
- webpack.config.js====entry入口文件的配置
1. 一般是采用对象语法: entry: { index: './src/default/js/index.js' }, https://webpack.css88.com/concepts/ent ...
- [转] java实现https请求
package com.lichmama.test.util; import java.io.ByteArrayOutputStream; import java.io.IOException; im ...
- Java基础语法(自定义类、ArrayList集合)
Java基础语法 今日内容介绍 u 自定义类 u ArrayList集合 第1章 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类 ...
- 织梦dedecms手机版上下篇链接错误的解决方法
打开 \include\arc.archives.class.php 1. 找到 $this->PreNext['pre'] = "上一篇:<a href='$mlink'> ...
- idea2018.1.2 激活
https://www.cnblogs.com/ycjcham/p/8724451.html
- CRC检错技术原理
一.题外话 说来惭愧,一开始是考虑写关于CRC检错技术更深层次数学原理的,然而在翻看<Basic Algebra>后,我果断放弃了这种不切实际的想法.个人觉得不是因为本人数学水平差或者能力 ...
- (四)我的JavaScript系列:原型链
夜深风竹敲秋韵,万叶千声皆是恨. 原型链对于JavaScript来说是个很核心的概念.JavaScript不是基于类模板的面向对象语言:反而,它的面向对象机制是基于原型的.我们不可能说某个对象属于什么 ...