题目

为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔。

简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是

传输信息所用的数据通道,划分成N *m 个区块。

然而,随着工作的继续进行,他们希望把侧面的一部分区块也改造成其他模块。然而,任何时候都

必须保证存在一条数据通道,能从圆柱体的一端通向另一端。

由于无法使用辉之环掌控下的计算系统,他们寻求你的帮助来解决这个问题。他们将逐个输入想要

改造的区域,而你则执行所有可行的改造并忽略可能导致数据中断的改造。

分析

圆柱体,所以左右两边相通。将这N*M个区块复制一个,并起来。

发现,如有有两个区块都被改造了,那么当其中个区块是在另一个区块的八个方向相邻的话,数据就不能从之间通过。

于是,我们搞个并查集,当改造一个区块时,如果在改造后,与之对应的被复制的区块,在并查集中有共同的父亲,那么这个区块就不合法,因为当区块和被复制的区块中可以通过区块相连,又因为每个区块都有对应的被复制的区块,显然整个圆柱体就一定被挡住了。

如果这个区块合法,那么将它八个方向相邻的区块中被改造的都和他用并查集合在一起。

有个小细节要就是当某个区块的八个方向相邻的区块中有列数小于1或大于2m的要处理一下。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=3005;
using namespace std;
int k,n,m,fa[N*N*2],a[N][N*2],ans;
int z[8][2]=
{
{-1,0},
{0,-1},
{1,0},
{0,1},
{-1,1},
{1,-1},
{1,1},
{-1,-1}
};
int pos(int x,int y)
{
return (x-1)*m*2+y;
}
int get(int x)
{
if(fa[x]==x) return x;
fa[x]=get(fa[x]);
return fa[x];
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n*m*2;i++) fa[i]=i;
for(k=k;k>=1;k--)
{
int x,y;
scanf("%d%d",&x,&y);
int xx=x,yy=y+m;
bool q=true;
for(int i=0;i<=7 && q;i++)
if(a[x+z[i][0]][(y+z[i][1]-1+2*m)%(2*m)+1])
{
int xf=get(pos(x+z[i][0],(y+z[i][1]-1+2*m)%(2*m)+1));
for(int j=0;j<=7 && q;j++)
if(a[xx+z[j][0]][(yy+z[j][1]-1+2*m)%(2*m)+1])
{
int yf=get(pos(xx+z[j][0],(yy+z[j][1]-1+2*m)%(2*m)+1));
if(xf==yf) q=false;
}
}
if(q)
{
a[x][y]=a[xx][yy]=1;
for(int i=0;i<=7;i++)
if(a[x+z[i][0]][(y+z[i][1]-1+2*m)%(2*m)+1])
{
int xf=get(pos(x+z[i][0],(y+z[i][1]-1+2*m)%(2*m)+1));
fa[xf]=pos(x,y);
}
for(int j=0;j<=7;j++)
if(a[xx+z[j][0]][(yy+z[j][1]-1+2*m)%(2*m)+1])
{
int yf=get(pos(xx+z[j][0],(yy+z[j][1]-1+2*m)%(2*m)+1));
fa[yf]=pos(xx,yy);
}
ans++;
}
}
cout<<ans<<endl;
}

最新文章

  1. js多文件上传
  2. Statement returned more than one row, where no more than one was expected
  3. java多线程系列4-线程池
  4. Linear Predictors
  5. Git的安装以及一些操作
  6. sass中 混合宏 VS 继承 VS 占位符 各自的使用时机和特点
  7. [Angular 2] Component relative paths
  8. freemarker序列的拆分
  9. 在C#环境中动态调用IronPython脚本(二)
  10. Nginx http_user_agent 防御 ab 等
  11. 学习笔记TF032:实现Google Inception Net
  12. BZOJ:3911: SGU383 Caravans(三角剖分)
  13. POJ3264-Balanced Lineup-线段树
  14. Java作业九(2017-11-6)
  15. mui返回上个页面并刷新数据
  16. VNPY - windows 安装踩坑记录
  17. MyBatis:自定义Mapper
  18. 5 Http请求中文乱码处理
  19. AJAX的优点 个人理解记录
  20. ubuntu 设置github秘钥

热门文章

  1. squid代理使用yum源
  2. Shell编程、part5
  3. 深入理解java:4.1. 框架编程之Spring MVC
  4. IntelliJ IDEA将导入的项目转成maven项目
  5. openvswitch安装与使用
  6. PostgreSQL数据库表的内部结构
  7. 2015沈阳区域赛Meeting(最短路 + 建图)
  8. void *与id类型的相互转换
  9. Electric Charges CodeForces - 623C (二分答案)
  10. 利用ios safari浏览器生成桌面快捷方式并唤醒app的示例代码