NCPC2016-A-ArtWork
题目描述
x 1 ≤ x ≤ x 2 and y 1 ≤ y ≤ y 2 .
The beauty of an artwork is the number of regions in the grid. Each region consists of one or more white squares that are connected to each other using a path of white squares in the grid, walking horizontally or vertically but not diagonally. The initial beauty of the artwork is 1. Your task is to calculate the beauty after each new stroke. Figure A.1 illustrates how the beauty of the artwork varies in Sample Input 1.

输入
Then follow q lines that describe the strokes. Each line consists of four integers x 1 , y 1 , x 2 and y 2 (1 ≤ x 1 ≤ x 2 ≤ n, 1 ≤ y 1 ≤ y 2 ≤ m). Either x 1 = x 2 or y 1 = y 2 (or both).
输出
样例输入
4 6 5
2 2 2 6
1 3 4 3
2 5 3 5
4 6 4 6
1 6 4 6
样例输出
1
3
3
4
3
题意是给你一个n*m的矩阵,q次询问,每次将连续的一些竖直或水平的格子染黑,问每一步操作之后白色联通块的个数 从最后一种局面往前走,先求出所有操作之后白色联通块的数量,然后逐条删去黑线,对新出现的白格子,要么和原有的某个联通块相连,要么属于单独的联通块
用并查集维护联通块
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e3+;
const int dx[]={,-,,};
const int dy[]={,,,-};
int n,m,q,cnt;
struct line{
int x1,x2,y1,y2;}li[N*];
int f[N*N],num[N][N],ans[N*];
int Hash(int x,int y)
{
return (x-)*m+y;
}
int fund(int x)
{
if (f[x]==x) return f[x];
return f[x]=fund(f[x]);
}
void join(int x,int y)
{
int fx=fund(x),fy=fund(y);
if (fx!=fy)
{
cnt--;
f[fx]=fy;
}
}
void dfs(int x,int y)
{
int id=Hash(x,y);
for (int i=;i<;i++)
{
int fx=x+dx[i],fy=y+dy[i];
if (fx<||fx>n||fy<||fy>m) continue;
if (num[fx][fy]==)
{
join(id,Hash(fx,fy));
}
}
}
void print(line l)
{
for (int i=l.x1;i<=l.x2;i++)
for (int j=l.y1;j<=l.y2;j++)
{
if (num[i][j]==) cnt--;
num[i][j]++;
}
}
void reprint(line l)
{
for (int i=l.x1;i<=l.x2;i++)
for (int j=l.y1;j<=l.y2;j++)
{
num[i][j]--;
if (num[i][j]==)
{
cnt++;
dfs(i,j);
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&q);
cnt=n*m;
for (int i=;i<=cnt;i++) f[i]=i;
for (int i=;i<=q;i++)
{
scanf("%d%d%d%d",&li[i].x1,&li[i].y1,&li[i].x2,&li[i].y2);
print(li[i]);
} for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (num[i][j]==) dfs(i,j); for (int i=q;i>=;i--)
{
ans[i]=cnt;
reprint(li[i]);
}
for (int i=;i<=q;i++) printf("%d\n",ans[i]);
return ;
}
NCPC2016-A-ArtWork的更多相关文章
- Artwork
A template for an artwork is a white grid of n × m squares. The artwork will be created by painting ...
- NCPC 2016 October 8,2016 Artwork
Problem A Artwork Problem ID: artwork Time limit: 4 seconds A template for an artwork is a white gri ...
- Gym 102346A Artwork dfs
Artwork Gym - 102346A 题意:给n*m的地图,入口是(0,0),出口是(n,m),其中有k个监视器,坐标是(xi,yi),监视半径是r,问一个人能不能不被监视到,从起点到终点. 如 ...
- Artwork (Gym - 102346A)【DFS、连通块】
Artwork (Gym - 102346A) 题目链接 算法 DFS,连通块 时间复杂度:O(k*n + k * k) 1.这道题就是让你判断从(0,0)到(m,n),避开中途所有的传感器(传感器的 ...
- UVa LA 4636 Cubist Artwork 难度: 0
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- UVALive - 4636 Cubist Artwork(贪心)
题目链接 题意 给出正视图和侧视图,判断最少用几个立方体 分析 若存在高度相同的立方块,则以数目多的那面为准. #include <iostream> #include <cstdi ...
- Gym - 101550A Artwork (并查集在线做法)
题目链接 题意:给你一个n*m的网格图,初始时格点全白,每次可以将一段连续的格点涂黑.求出每次操作之后白色连通块的数量. 看了看网上的题解,基本全是离线的做法.其实这道题是有在线的做法的,利用了对偶图 ...
- UVa 1445 - Cubist Artwork
统计正面看高度为i的竖条个数为cnt1[i], 统计侧面看高度为i的竖条个数为cnt2[i]: ans = sum( i * max( cnt1[i], cnt2[i] ) ); ( 1 <= ...
- Artwork 18年中南多校第一场A
一.题意 对于一个矩阵,若干道命令,每道命令将会把某一段格子涂黑,请问每次涂黑之后矩阵中未被涂黑的块的数量? 二.思路 保存每道命令,并且忠实的执行他,到最后一步开始搜索联通块的数量,并将其保存. 之 ...
- Artwork Gym - 101550A 离线并查集
题目:题目链接 思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话dfs会爆栈,判断过于复杂也会导致超时,我们采用离线反向操作,先全部涂好,然后把黑格子逐步涂白,我们把每个空白区域当作一个并 ...
随机推荐
- 【动态规划】POJ-3616
一.题目 Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her pro ...
- java属性编辑器,即PropertyEditor
出处:http://www.iteye.com/topic/1123628
- jquery ajax 跨域问题
前言:关于跨域CORS 1.没有跨域时,ajax默认是带cookie的 2.跨域时,两种解决方案: 1)服务器端在filter中配置 详情:http://blog.csdn.net/wzl002/ar ...
- ABP ModuleZero后台框架materialize禁止模拟select和checkbox
使用abp modulezero自带那个后台框架发现一个操蛋的问题,所有的select和checkbox都被改成div模拟的,虽然比原生美观,但有时候真的很难用. 比如说要用select做一个联动菜单 ...
- NET Core 部署到 Windows服务
https://www.cnblogs.com/linezero/p/5159927.html https://www.cnblogs.com/emrys5/p/nssm-netcore.html h ...
- JS面向对象(封装,继承)
在六月份找工作中,被问的最多的问题就是: js面向对象,继承,封装,原型链这些,你了解多少? 额,,,我怎么回答呢, 只能说,了解一些,不多不少,哈哈哈哈,当然,这是玩笑话. 不过之前学过java,来 ...
- Selenium WebDriver 中鼠标和键盘事件分析及扩展(转)
文章转自:http://www.ibm.com/developerworks/cn/java/j-lo-keyboard/
- Excelutil 工具类
1.说明:ExcelUtil主要用于获得单元格的数据和对对指定单元格中写入数据用! 相关代码如下: package main.java; import java.io.File; import jav ...
- 关于js typeof 的理解
- C++ Primer 中文版 5th Edition 练习15.8和练习15.9的解答
练习15.8:给出静态类型和动态类型的定义. 答: 静态类型:是变量声明时的类型,或者是表达式生成的类型,这样的类型在编译时已知. 动态类型:是变量或者表达式表示的内存中的对象的类型,直到运行时才可知 ...