一、题意

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

二、思路

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

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

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

三、代码实现

#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. Spring注解之@Lazy注解,源码分析和总结

    一 关于延迟加载的问题,有次和大神讨论他会不会直接或间接影响其他类.spring的好处就是文档都在代码里,网上百度大多是无用功. 不如,直接看源码.所以把当时源码分析的思路丢上来一波. 二 源码分析 ...

  2. P1868 饥饿的奶牛

    题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有 ...

  3. 关于com工程依赖的一些总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 一是com组件工程的依赖设置.比如A这个组件工程要使用B组件工程的类,要如何设置呢?具体就是先把在A工程里加上B工程的 ...

  4. 构建第一个Spring Boot2.0应用之application.properties和application.yml(八)

    本节学习在项目中配置文件配置的方式,一种是通过applicaiton.properties,一种是通过application.yml方式. 一.环境: IDE:IntelliJ IDEA 2017.1 ...

  5. Android仿微信高效压缩图片(libjpeg)

    用过ios手机的同学应该很明显感觉到,ios拍照1M的图片要比安卓拍照排出来的5M的图片还要清晰.这是为什么呢? 这得了解android底层是如何对图片进行处理的. 当时谷歌开发Android的时候, ...

  6. Centos 编译安装bind错误

    [root@linux-node1 tmp]# tar xf bind-9.11.1-P1.tar.gz [root@linux-node1 tmp]# cd bind-9.11.1-P1 [root ...

  7. python_8_guess

    #python3和2都可以 #方法1 age_of_oldboy=56 count=0 while True: if count==3: break guess_age=int(input('gues ...

  8. 谷歌SwitchySharp && SwitchyOmega插件

    http://pan.baidu.com/s/1jOwgu 谷歌SwitchySharp插件 http://pan.baidu.com/s/1mgl7e2k SwitchySharp的升级版Switc ...

  9. Bootstrap 警告框(Alert)插件

    警告消息大多来是用来向终端用户提示警告或确认的消息,使用警告框插件,您可以向所有的警告框消息添加取消功能. 用法 您有以下两种方式启用警告框的可取消功能. 1.通过data属性:通过数据添加可取消功能 ...

  10. Oracle 字符串处理函数

    字符串处理函数 ① substr(string,a,b)/substr(string,a) string 为字符串,string 表示需要截取的字符串. a.b 均为整型数字,a 表示开始截取的位置, ...