一、题意

对于一个矩阵,若干道命令,每道命令将会把某一段格子涂黑,请问每次涂黑之后矩阵中未被涂黑的块的数量?

二、思路

保存每道命令,并且忠实的执行他,到最后一步开始搜索联通块的数量,并将其保存。

之后对于每道命令做撤回操作。每次撤回之后重新扫描命令覆盖区域中已经是空白块的区域。并且将它们用并查集的方式统一起来。

最后倒序输出保存的答案。

三、代码实现

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<set>
#include<map>
#include<string>
#include<queue> using namespace std;
#define ll long long
#define veci vector<int>
#define pp pair<ll,ll>
#define vecp vector<pp> const ll MAXN=; class point
{
public :
int x;int y;
point(){}
point(int a,int b):x(a),y(b){}
bool const operator == (point const &p1)
{
return x==p1.x&&y==p1.y;
}
}; class order
{
public :
point from,to;
order(){}
order(int a,int b,int c,int d)
{
from = point(a,b);
to = point(c,d);
}
};
ll n,m,k,num;
vector<order>ord;
veci ans;
point sett[MAXN][MAXN];
int mapp[MAXN][MAXN];
int addx[]={,,,-};
int addy[]={,-,,}; void draw(order o1)
{
for(int i=o1.from.x;i<=o1.to.x;++i)
{
for(int j=o1.from.y;j<=o1.to.y;++j)
{
if(mapp[i][j]==-)mapp[i][j]=;
mapp[i][j]++;
}
}
}
void erase(order o1)
{
for(int i=o1.from.x;i<=o1.to.x;++i)
{
for(int j=o1.from.y;j<=o1.to.y;++j)
{
mapp[i][j]--;
}
} } const point ZERO(,); void dfs(int x,int y,point tar)
{
if(x<||x>n||y<||y>m||mapp[x][y]!=-||sett[x][y]==tar)return ;
sett[x][y]=tar;
mapp[x][y]=;
for(int i=;i<;++i)
{
dfs(x+addx[i],y+addy[i],tar);
}
} point find_set(int x,int y)
{
if(sett[x][y].x==x&&sett[x][y].y==y)return sett[x][y];
else return sett[x][y]=find_set(sett[x][y].x,sett[x][y].y);
} void show(point p1)
{
int x=p1.x;
int y=p1.y;
cout<<"x: "<<x<<" y: "<<y<<endl;
} void deal(order o1)
{
for(int i=o1.from.x;i<=o1.to.x;++i)
for(int j=o1.from.y;j<=o1.to.y;++j)
{
if(mapp[i][j]==)
{
int isDealed=;
for(int k=;k<;++k)
{
int x=i+addx[k];
int y=j+addy[k];
if(x<||y<||x>n||y>m)continue;
if(mapp[x][y]==)
{
if(sett[x][y]==ZERO)continue;
if(!isDealed)
{
sett[i][j]=sett[x][y]=find_set(x,y); }else
{ sett[x][y]=find_set(x,y);
sett[i][j]=find_set(i,j);
if(sett[i][j]==sett[x][y])continue;
int xx=sett[x][y].x;
int yy=sett[x][y].y;
sett[xx][yy]=sett[i][j];
num--;
}
isDealed++;
}
}if(!isDealed)
{
sett[i][j]=point(i,j);
num++;
} }
} } void init()
{
num=;
ord.clear();
ans.clear();
memset(mapp,-,sizeof(mapp));
memset(sett,,sizeof(sett));
for(int i=;i<k;++i)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
order o1(a,b,c,d);
draw(o1);
ord.push_back(o1);
}
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
{
if(mapp[i][j]==-)
{
point tar(i,j);
dfs(i,j,tar);
num++;
}
}
ans.push_back(num); int len=ord.size();
for(int i=len-;i;--i)
{
order now=ord[i];
erase(now);
deal(now);
ans.push_back(num);
}
len = ans.size();
for(int i=len-;i>=;--i)
cout<<ans[i]<<endl; } int main()
{
// cin.sync_with_stdio(false); while(cin>>n>>m>>k)init(); return ;
}

Artwork 18年中南多校第一场A的更多相关文章

  1. Card Hand Sorting 18中南多校第一场C题

    一.题意 随机给你一堆牌(标准扑克牌),之后让你按照: 第一优先规则:所有相同花色的在一起 第二优先规则:所有相同花色的必须按照升序或者降序排列 问,你最少要拿出多少张牌插入到其他的地方以维持这个状况 ...

  2. Highest Tower 18中南多校第一场H题

    一.题意 给出N个方块,要求给出一个方案,使得1. 所有方块都被使用到(题目数据保证这点) 2.所有方块垒成一个塔,且上面的方块宽度小于下面的方块 3.每个方块只能用一次,可以横着或者竖着. n范围5 ...

  3. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  4. 牛客多校第一场 B Inergratiion

    牛客多校第一场 B Inergratiion 传送门:https://ac.nowcoder.com/acm/contest/881/B 题意: 给你一个 [求值为多少 题解: 根据线代的知识 我们可 ...

  5. HDU6581 Vacation (HDU2019多校第一场1004)

    HDU6581 Vacation (HDU2019多校第一场1004) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6581 题意: 给你n+1辆汽车, ...

  6. 2019年牛客多校第一场B题Integration 数学

    2019年牛客多校第一场B题 Integration 题意 给出一个公式,求值 思路 明显的化简公式题,公式是分母连乘形式,这个时候要想到拆分,那如何拆分母呢,自然是裂项,此时有很多项裂项,我们不妨从 ...

  7. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

  8. 2019年湖南多校第一场||2018-2019 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2018)

    第一场多校就打的这么惨,只能说自己太菜了,还需继续努力啊- 题目链接: GYM链接:https://codeforces.com/gym/101933 CSU链接:http://acm.csu.edu ...

  9. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

随机推荐

  1. Swift基础学习笔记

    1.在学基本语法之前,简单看一下与OC的不同 注释:OC       #pragma marks  视图加载完成 Swift    //MARK: 视图加载完成   //TOOO:设置背景颜色(Xco ...

  2. 使用Set去除String中的重复字符

    使用Set去除String中的重复字符 public class test14 { public static void main(String[] args) { String str = &quo ...

  3. Hibernate笔记7--JPA CRUD

    1.环境搭建,注意包结构的问题,src下建立名为META-INF的文件夹,放persistence.xml,位置放错,读不到会报错. <?xml version="1.0" ...

  4. 用xaml画的带阴影3D感的圆球

    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center"> <E ...

  5. sql server 2012安装程序图

    重点:下面的安装步骤都在断网环境下安装的 因为我想查看联网跟没有联网SQL2012会不会下载并安装.net2.0 和.net3.5和.net4和SP1补丁包 我的环境: 没有集成SP1补丁包的安装包大 ...

  6. Python对Excel操作详解

      Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl   ...

  7. DataView RowFilter

    DataView类用来表示定制的DataTable的视图. DataTable和DataView的关系是遵循著名的设计模式--文档/视图模式,其中DataTable是文档,而Dataview是视图. ...

  8. 兼容ie8的圆形进度条

    主要是利用html5中的svg 画出圆形进度条 并且兼容ie8 https://github.com/GainLoss/Circular-progress-bar

  9. java Vamei快速教程18 容器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java中有一些对象被称为容器(container).容器中可以包含多个对象,每个 ...

  10. [Rails学习之路]初识Ruby(一)

    Ruby是一门动态的.强类型的.纯面向对象的编程语言.它和Python非常相似,但比Python面向对象更加彻底.使用更加灵活.语法更加复杂.也更为有趣. 抛开做事情到底应该有多少种方法这个问题,我相 ...