Description

为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔。
简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是
传输信息所用的数据通道,划分成 N∗mN *m 个区块。
然而,随着工作的继续进行,他们希望把侧面的一部分区块也改造成其他模块。然而,任何时候都
必须保证存在一条数据通道,能从圆柱体的一端通向另一端。
由于无法使用辉之环掌控下的计算系统,他们寻求你的帮助来解决这个问题。他们将逐个输入想要
改造的区域,而你则执行所有可行的改造并忽略可能导致数据中断的改造。

Input

第一行,包含两个整数 N;M;KN;M;K,表示侧面的长和宽,以及操作数。
接下来K 行,每行包含三个整数 xi;yixi; yi ,表示操作的区块的坐标。
数据保证不会对已经操作成功的区块进行操作。

Output

输出一行,表示有多少个操作可以被执行。

Sample Input

3 4 9
2 2
3 2
2 3
3 4
3 1
1 3
2 1
1 1
1 4

Sample Output

6

Data Constraint

• 对于分值为30 的子任务1,保证 N;M<=100;K<=5000N;M
• 对于分值为30 的子任务2,保证 N;M<=3000;K<=5000N;M
• 对于分值为40 的子任务3,保证 N;M<=3000;K<=300000N;M 。

Hint

Solution

  • 这道题是一道神奇的模拟题!!!

  • 很容易想到的普通暴力枚举在这个超大范围下也无能为力~

  • 这里有一个利用并查集的巧妙方法

  • 首先,注意到路径可以横跨左右边界

  • 所以,把这个图向右复制一份,即 长*2 ,点都双份处理

  • 每一个点(编号排成一列地处理)与八连通的点进行并查集

  • 那么如何判断加点时,所构成的联通快有没有横向封盖呢?

  • 于是设一个标记数组,记号可以设为数据编号这种独一无二的号码

  • 将要加入的点在左边地图里的八连通点,这些点的父亲编号在标记数组里赋值

  • 然后在右边地图里的八连通点的父亲编号在标记数组里查询

  • 如果已赋值,说明加入的话会构成横向封盖,则不能加入!

  • 这样,我们就能方便的判断,省去了在并查集数组里加加删删的麻烦!

  • 这样巧妙地运用并查集,使时间复杂度降到了 O(K)O(K) 再加一些常数!!!

Code

#include<cstdio>
using namespace std;
const int N=3001,M=2*N*N;
const int way[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,1},{-1,-1},{1,-1}};
int n,m,cnt,ans;
int f[M],g[M];
bool bz[M];
bool pd;
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline int get(int x,int y){return (x-1)*2*m+y;}
inline int find(int x){return (f[x]==x)?x:f[x]=find(f[x]);}
inline void work(int x,int y)
{int p=get(x,y);bz[p]=true;for(int i=0;i<8;i++){int xx=x+way[i][0],yy=y+way[i][1];if(!xx || xx>n) continue;if(!yy) yy+=2*m; else if(yy>2*m) yy-=2*m;int q=get(xx,yy);if(bz[q]){int f1=find(p),f2=find(q);if(f1!=f2) f[f1]=f2;}       }
}
int main()
{n=read(),m=read(),cnt=get(n,2*m);for(int i=1;i<=cnt;i++) f[i]=i;int k=read()+1;while(--k){int x=read(),y=read();for(int i=0;i<8;i++){int xx=x+way[i][0],yy=y+way[i][1];if(!xx || xx>n) continue;if(!yy) yy+=2*m; else if(yy>2*m) yy-=2*m;int p=get(xx,yy);if(bz[p]) g[find(p)]=k;}for(int i=pd=0;i<8;i++){int xx=x+way[i][0],yy=y+m+way[i][1];if(!xx || xx>n) continue;if(!yy) yy+=2*m; else if(yy>2*m) yy-=2*m;int p=get(xx,yy);if(bz[p] && g[find(p)]==k){pd=true;break;}}if(!pd){ans++;work(x,y);work(x,y+m);}}printf("%d",ans);return 0;
}

JZOJ 3809. 【NOIP2014模拟8.25】设备塔相关推荐

  1. JZOJ 3809 【NOIP2014模拟8.25】设备塔

    设备塔 Description 有一个NN*MM的网格图,特别的,第11列与第MM列相邻.现在有KK个操作,每个操作给出两个整数XX,YY,表示将(XX,YY)的网格变成障碍(即不可通过区域),若某次 ...

  2. JZOJ 3807. 【NOIP2014模拟8.25】地砖铺设

    Description 在游戏厅大赚了一笔的Randy 终于赢到了他想要的家具.乘此机会,他想把自己的房间好好整理一 下. 在百货公司,可以买到各种各样正方形的地砖,为了美观起见,Randy 不希望同 ...

  3. JZOJ 3808. 【NOIP2014模拟8.25】道路值守

    Description Crossbell 自治州有着四通八达的现代化交通.时值独立庆典之际,随着来自周边国家旅客的日益增 多,犯罪行为也悄无声息开始滋长起来. 特别任务支援科的警察们从总部收到了关于 ...

  4. [JZOJ3809]设备塔

    其实我并没有JZOJ的号...但既然dalao说了是JZOJ上的题,那就是了吧...... 为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔. 简单的说,这座设备塔是一个漂浮在异空间中 ...

  5. linux 模拟生成 CAN 设备

    /*************************************************************************************** linux 模拟生成 ...

  6. 7-4 堆栈模拟队列 (25 分)

    7-4 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q. 所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S):判 ...

  7. PTA: 7-2 银行业务队列简单模拟 (25 分)

    大一下半期数据结构 数据结构题目集 7-2 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客 ...

  8. jzoj2702. 探险jzoj3917. 【NOIP2014模拟11.2A组】福慧双修

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  9. 安卓手机 模拟辅助显示设备

    标签:安卓手机模拟辅助显示设备,安卓开发者模式副屏显示,方便调试AR,VR眼镜, 安卓手机模拟屏显示 部分项目上要用到安卓手机副屏,尤其做AR眼镜开发时,这时可以通过 TYPEC转HDMI线 一端连接 ...

最新文章

  1. poj1274(二分图匹配)
  2. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
  3. git提交过滤target文件 idea_找不到或无法加载主类(IDEA中启动spring boot项目)
  4. Camel中的几个重要概念之 Components
  5. HDU_2544 最短路(Dijkstra)
  6. [转]网页栅格系统研究(2):蛋糕的切法
  7. NET脏字过滤算法 收藏
  8. DenseNet:比ResNet更优的CNN模型
  9. 从单张图重建三维人体模型综述(五)
  10. Java集合常见面试题集锦
  11. CSS中常用的选择器
  12. 人工智能的不可解释性
  13. 一篇文章带你了解国企程序员(超详细)
  14. 机器学习6:单层感知器
  15. kubernetes面试题汇总
  16. Unity VR开发教程 OpenXR+XR Interaction Toolkit 2.1.1 (一) 安装和配置
  17. 分治法 —— 循环比赛日程安排表
  18. 【论文阅读】Recurrent Chunking Mechanisms for Long-Text Machine Reading Comprehension
  19. 初学者怎么学习网页设计
  20. CentOS下安装man手册

热门文章

  1. 转载:理解机器学习中的偏差与方差
  2. Qt中ui文件的使用
  3. matlab cell类型数组存至txt文件
  4. 【Python】一种超简单的变量交换方法
  5. mysql 查找密码忘记,Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
  6. axios 登录后设置header_axios如何利用promise无痛刷新token
  7. easyexcel根据模板写入_ProxmoxVE 之 创建win10基础镜像模板
  8. VTK修炼之道66:体绘制裁剪_Cripping技术
  9. js按键处理demo
  10. FFmpeg--av_register_all函数分析