一、题意

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

二、思路

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

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

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

三、代码实现

#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. 性能测试学习第四天_Loadrunner概述

    1.Loadrunner的组成部分 ·脚本生成器VuGen:virtual user generator ·压力控制器Controller,License主要在这里控制 ·结果分析软件Analysis ...

  2. 一、 Spring Cloud Eureka ,咱们先跑起来

    一.Spring Cloud 简介 Spring Cloud 是一个基于Spring Boot 实现的微服务架构开发工具.是一个涉及到服务治理.分布式配置管理.负载均衡.服务容错.API网关.消息总线 ...

  3. 在Magento中用MySQL模拟队列发送电子邮件

    1. 需求 顾客在网站上购买特定商品并且这些商品的总金额超过特定金额后,使用email给顾客发送一个优惠券:假如某件商品已经降价了,则此商品的金额不计算在目标总金额内: 2. 需求分析 ①发送优惠券的 ...

  4. Python开发环境Wing IDE如何调试进程异常报告

    Wing IDE的调试器所报告的任何异常,都会在调试器以外的任何代码运行事件中展示出来. 通过使用Debug工具或者是Debug菜单中的Start / Continue继续调试过程的异常检测. Win ...

  5. 编译出freeswitch的java调用的 jar和so

    假设freeswitch 源码路径为 /usr/local/src/freeswitch 1. cd /usr/local/src/freeswitch(源代码的根目录) 执行./configure, ...

  6. 【Android开发笔记】底部菜单栏 FragmentTabHost

    公司项目,需求本来是按照谷歌官方指南写的,菜单栏设计成在导航栏下方 结果呢,审评时,BOSS为了和iOS统一,改成了底部菜单栏(标准结局),我只能呵呵呵呵呵呵呵 查了查资料发现实现底部菜单栏用的是Fr ...

  7. linux下如何实现mysql数据库定时自动备份

    概述   备份是容灾的基础,是指为防止系统出现操作失误或系统故障导致数据丢失,而将全部或部分数据集合从应用主机的硬盘或阵列复制到其它的存储介质的过程.而对于一些网站.系统来说,数据库就是一切,所以做好 ...

  8. OpenSSL s_server / s_client 应用实例

    netkiller openssl tls 目录[-] 12.6. s_server / s_client 12.6.1. SSL POP3 / SMTP / IMAP 12.6.2. server ...

  9. pat甲级1020中序后序求层序

    1020 Tree Traversals (25)(25 分) Suppose that all the keys in a binary tree are distinct positive int ...

  10. NYOJ-22-素数求和问题

    原题地址 素数求和问题 描述 现在给你N个数(0<N<1000),现在要求你写出一个程序,找出这N个数中的所有素数,并求和. 输入 第一行给出整数M(0<M<10)代表多少组测 ...