[JZOJ3809]设备塔
其实我并没有JZOJ的号...但既然dalao说了是JZOJ上的题,那就是了吧......
为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔。 简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是 传输信息所用的数据通道,划分成 N ∗ m 个区块。 然而,随着工作的继续进行,他们希望把侧面的一部分区块也改造成其他模块。然而,任何时候都 必须保证存在一条数据通道,能从圆柱体的一端通向另一端。 由于无法使用辉之环掌控下的计算系统,他们寻求你的帮助来解决这个问题。他们将逐个输入想要 改造的区域,而你则执行所有可行的改造并忽略可能导致数据中断的改造。
Input
第一行,包含两个整数 N, M, K,表示侧面的长和宽,以及操作数。
接下来 K 行,每行包含三个整数 xi , yi,表示操作的区块的坐标。
数据保证不会对已经操作成功的区块进行操作。
Output
输出一行,表示有多少个操作可以被执行。
•对于分值为 30 的子任务 1,保证 N, M ≤ 100, K ≤ 5000
• 对于分值为 30 的子任务 2,保证 N, M ≤ 3000, K ≤ 5000
• 对于分值为 40 的子任务 3,保证 N, M ≤ 3000, K ≤ 300000。
30分暴力做法:
对于每一个点DFS暴力判断是否可以加入
代码大概长得是这个样子:
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x>) write(x/),putchar(x%+'');
else putchar(x+'');
}int n,m,K,a[][],ans,Begin,ff,vis[][],fail[][],x,y,dx[]={,,},dy[]={,,-},ll[];
bool dfs(int x,int y){
if(ff) return ;
if(x==n) return ff=;
for(register int i=;i<;++i){
int fx=x+dx[i],fy=y+dy[i];
if(fy==m+) fy=;
if(fy==) fy=m;
if(vis[fx][fy]) continue;
vis[fx][fy]=;
if(dfs(fx,fy)) return ;
vis[fx][fy]=;
}return ;
}inline bool check(int x,int y){
a[x][y]=,ff=;
for(int i=;i<=m;i++) if(!ll[i]&&y!=i) return ;
for(register int i=;i<=m;i++){
memcpy(vis,a,sizeof(vis));
if(!vis[][i]&&dfs(,i)) return ;
}a[x][y]=;return ;
}int main(){
// freopen("3.in","r",stdin);
n=read(),m=read(),K=read();
for(register int i=;i<=K;++i){
x=read(),y=read();
if(ans+<m) {ll[y]=,a[x][y]=,++ans;continue;}
if(fail[x][y]) continue;
if(check(x,y)) ++ans,ll[y]=;else fail[x][y]=;
}cout<<ans;
return ;
}
正解分析:
首先这是一个环...所以我们把它破环成链,像这个样子

我们把每次加入的点丢到并查集里面
然后再分析一下如果加入一个点之后就不能往下继续走的情况下:
如果当前点和它的“分身点”的连线在同一个集合(并查集维护)里那么横着的这条通道就被封锁了,就是说不存在一条道路使其能从上到下
不太好讲...看不懂的话看代码会容易理解一点
然后我这一节晚自习查了那么久的错,竟然是错在了check完了之后如果可以放就要把它填充起来,结果我手残在前面打了一个return 1;
代码:
#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}int fa[],n,m,k,a[][],tot,ans,fail[][],dx[]={-,-,,,,,,-},dy[]={-,,-,,,-,,};
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline int work(int &y){if(y==) y=m+m;if(y==m+m+) y=;}
inline bool check(int x,int y,int t){
for(register int i();i<;++i){
int fx=x+dx[i],fy=y+dy[i]; work(fy);
if(fx<||fx>n||!fail[fx][fy]) continue;
int t1=a[fx][fy];
for(register int j();j<;++j){
int xx=x+dx[j],yy=y+m+dy[j];work(yy);
if(xx<||xx>n||!fail[xx][yy]) continue;
int t2=a[xx][yy];
if(find(t1)==find(t2)) return ;
}
}for(register int i();i<;++i){//没错我就在这里打了return 1;
int fx=x+dx[i],fy=y+dy[i];work(fy);
if(fx<||fx>n||!fail[fx][fy]) continue;
int t1=a[fx][fy];
int tt=find(t),tt1=find(t1);
if(tt!=tt1) fa[tt]=fa[tt1];
fy=(fy+m);work(fy);
if(!fail[fx][fy]) continue;
t1=a[fx][fy];
int ppp=y+m;work(ppp);
int t2=a[x][ppp];
tt=find(t1),tt1=find(t2);
if(tt!=tt1) fa[tt]=fa[tt1];
}return ;
}signed main(){
n=read(),m=read(),k=read();
for(register int i();i<=n;++i)for(register int j();j<=m<<;++j)a[i][j]=++tot,fa[tot]=tot;
while(k--){
int x=read(),y=read(),t=a[x][y];
if(check(x,y,t)) ++ans,fail[x][y]=fail[x][y+m]=;
}printf("%d",ans);
return ;
}
[JZOJ3809]设备塔的更多相关文章
- 【NOIP2014模拟8.25】设备塔
题目 为了封印辉之环,古代塞姆利亚大陆的人民在异空间中建造了一座设备塔. 简单的说,这座设备塔是一个漂浮在异空间中的圆柱体,圆柱体两头的圆是计算核心,而侧面则是 传输信息所用的数据通道,划分成N *m ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l 说说关于cocos2dx手机分辨率适配 l 对前一篇完成的塔防游戏原型进 ...
- [译]终极塔防——运用HTML5从头创建一个塔防游戏
翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...
- Cocos2D:塔防游戏制作之旅(二)
一个象牙塔的视图 如果你并不熟悉此类型的游戏,塔防游戏是一个战略游戏,你需要购买和将武装塔放置在战略位置,去阻止一波又一波的敌人到达并摧毁你的基地 每一波敌人都更强,这些更强的对手有着更快的速度和对于 ...
- [Kingdom Rush]团队分享:如何做塔防手游
转自:http://www.gamelook.com.cn/2015/03/207324 GameLook报道/2014年11月,乌拉圭开发商Ironhide Studios发布的<Kingdo ...
- 赋予楼宇“智慧大脑”:厦门双子塔3D可视化
前言 今年10月7日,是国务院批准设立厦门经济特区40周年纪念日.1980年的这一天,国务院正式批复同意在厦门湖里地区划出一块2.5平方公里的土地,设立经济特区.厦门,成为中国最早设立的四个经济特区之 ...
- iNeuOS工业互联网操作系统,设备振动状态监测、预警和分析应用案例
目 录 1. 概述... 2 2. 系统部署结构... 2 3. 系统应用介绍... 4 4. 专业分析人员... 8 5. 应用案例分享 ...
- 几个有趣的WEB设备API(二)
浏览器和设备之间还有很多有趣的接口, 1.屏幕朝向接口 浏览器有两种方法来监听屏幕朝向,看是横屏还是竖屏. (1)使用css媒体查询的方法 /* 竖屏 */ @media screen and (or ...
- 干货分享:SQLSERVER使用裸设备
干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...
随机推荐
- PHP 之ip查询接口
/** * @param $ip 待查询的ip * @return mixed */ function getIpAddressInfo($ip) { $ipurl = 'http://api.ip1 ...
- 微信小程序video
1.video是原生组件原生组件的层级是最高的,想要覆盖在video上,只能用cover-view 和 cover-image 组件,这2个可以无限嵌套.适用场景:给视频加标题: 2.检测video播 ...
- tomcat8安装及配置
首先是解压版的安装.很简单,直接解压到要安装的位置就OK了. 2.启动 bin目录下,执行startup.bat文件 3.浏览器中打开地址http://localhost:8080/
- Going Home HDU - 1533(最大费用最小流)
On a grid map there are n little men and n houses. In each unit time, every little man can move one ...
- uva-156(Ananagrams UVA - 156)
map容器的模板题,判断是否能交换字母顺序变成另外一个单词,只需要先把单词都变成小写字母.然后再按字母字典序排序,放入map中进行计数,然后把计数为一的再放入另一个容器,再排序输出即可 我的代码(刘汝 ...
- python学习笔记--深拷贝与浅拷贝的区别
首先我们来讲讲我们python中的可变对象和不可变对象: 可变对象:该对象指向内存中的值是可以改变的.实际上是其所指的值直接发生改变,而不是发生复制,或者开辟一个新的地址空间.例如:列表list,字典 ...
- 洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊
[题解] 这道题可以用Link-Cut Tree写.. 首先建立一个虚拟节点N+1,$i$与$N+1$连边表示$i$被弹飞了 对于修改操作,先$cut(i,min(n+1,i+k[i]))$,然后再$ ...
- 【模板】Tarjan缩点
洛谷3387 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; ...
- [poj1062]昂贵的聘礼_最短路_离散化
昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...
- LeetCode 122 Best Time to Buy and Sell Stock II(股票买入卖出的最佳时间 II)
翻译 话说你有一个数组,当中第i个元素表示第i天的股票价格. 设计一个算法以找到最大利润. 你能够尽可能多的进行交易(比如.多次买入卖出股票). 然而,你不能在同一时间来多次交易. (比如.你必须在下 ...