「Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯」
USACO的又一道搜索题
前置芝士
具体做法
对于一个点,它可能有不止一个房间,虽然可以开一个\([x_1][y_1][x_2][y_2]\)的邻接矩阵,但是每次查询时需要\(\theta(N^2)\)枚举,十分的麻烦,还可能会T,这时就需要用到链式前向星来优化了,不仅优化了时间,还优化了空间,简直一举两得.这里的链式前向星的写法也很简单:
代码
struct Edge//定义一个结构体
{
int next;
int x,y;
}edge[maxM];
int cnt=0;
int _head[maxN][maxN];
void Add(Room a,Room b)//在房间a和房间b间添加一条边
{
edge[++cnt].x=b.x;
edge[cnt].y=b.y;
edge[cnt].next=_head[a.x][a.y];
_head[a.x][a.y]=cnt;
}
//一时define一时爽,一直define一直爽
#define For(x,y) for(int _i_=_head[x][y];_i_;_i_=edge[_i_].next)
#define X edge[_i_].x
#define Y edge[_i_].y
对于每个点它只会进一次队列,但是如果那时它的灯没有打开,不代表这个灯永远不会被打开,所以在每进入一个房间后需要判断被打开灯的房间是否被询问过,如果被询问过需要将这个点放入队列.
注意输出的是有多少个房间的灯可以被打开.
有一些具体的细节讲.
代码
#include<bits/stdc++.h>
#define rap(i,first,last) for(int i=first;i<=last;++i)
using namespace std;
const int maxN=105;
const int maxM=1e6+5;
const int move_x[5]={233,1,-1,0,0};
const int move_y[5]={233,0,0,1,-1};
int head=0,tail=1;
bool visit[maxN][maxN];
struct Que//队列
{
int x;
int y;
}que[maxN*maxN];//队列里最多N^2个房间,每个房间只会进一次
int N,M;
struct Room//对于房间再开一个结构体
{
int x,y;
};
//链式前向星
struct Edge
{
int next;
int x,y;
}edge[maxM];
int cnt=0;
int _head[maxN][maxN];
bool opened[maxN][maxN];
void Add(Room a,Room b)
{
edge[++cnt].x=b.x;
edge[cnt].y=b.y;
edge[cnt].next=_head[a.x][a.y];
_head[a.x][a.y]=cnt;
}
int answer=1;
#define For(x,y) for(int _i_=_head[x][y];_i_;_i_=edge[_i_].next)
#define X edge[_i_].x
#define Y edge[_i_].y
//
void Open(int x,int y)//打开一个房间的开关
{
For(x,y)
if(!opened[X][Y])//注意要有这个特判
{
opened[X][Y]=1;
answer++;//每打开一个灯answer++
if(visit[X][Y])//如果询问过就放入队列
{
que[++tail].x=X;
que[tail].y=Y;
}
}
}
int main()
{
scanf("%d%d",&N,&M);
Room room1,room2;
rap(i,1,M)
{
scanf("%d%d%d%d",&room1.x,&room1.y,&room2.x,&room2.y);
Add(room1,room2);//添加一条边
}
rap(i,1,N)visit[i][0]=visit[0][i]=visit[N+1][i]=visit[i][N+1]=1;//在四周打上标记
que[1].x=1;
que[1].y=1;
opened[1][1]=1;
while(++head<=tail)
{
Open(que[head].x,que[head].y);//在队头时打开比较方便,不会有遗漏
rap(i,1,4)
if(opened[que[head].x+move_x[i]][que[head].y+move_y[i]])//如果这个位置的灯被打开了
{
if(!visit[que[head].x+move_x[i]][que[head].y+move_y[i]])//没有询问过就放入队列
{
visit[que[head].x+move_x[i]][que[head].y+move_y[i]]=1;
que[++tail].x=que[head].x+move_x[i];
que[tail].y=que[head].y+move_y[i];
}
}
else
{
visit[que[head].x+move_x[i]][que[head].y+move_y[i]]=1;//没有被打开也要标记为询问过
}
}
printf("%d",answer);//输出answer
return 0;
}
「Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯」的更多相关文章
- Luogu P2845 [USACO15DEC]Switching on the Lights 开关灯(bfs)
P2845 [USACO15DEC]Switching on the Lights 开关灯 题意 题目背景 来源:usaco-2015-dec \(Farm\ John\)最近新建了一批巨大的牛棚.这 ...
- P2845 [USACO15DEC]Switching on the Lights 开关灯
题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一个N*N的矩形网络.(1<n<100) 然而bessie十分怕黑,他想计算可以把 ...
- 搜索【洛谷P2845】 [USACO15DEC]Switching on the Lights 开关灯
P2845 [USACO15DEC]Switching on the Lights 开关灯 题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一 ...
- 「Luogu P5494 【模板】线段树分裂」
(因为没有认证,所以这道题就由Froggy上传) 线段树分裂用到的地方确实并不多,luogu上以前也没有这道模板题,所以就出了一道,实在是想不出怎么出模板了,所以这道题可能可以用一些其他的算法水过去. ...
- [Luogu 3128] USACO15DEC Max Flow
[Luogu 3128] USACO15DEC Max Flow 最近跟 LCA 干上了- 树剖好啊,我再也不想写倍增了. 以及似乎成功转成了空格选手 qwq. 对于每两个点 S and T,求一下 ...
- 洛谷P2828 Switching on the Lights(开关灯)
P2828 Switching on the Lights(开关灯) 题目背景 来源:usaco-2015-dec Farm John 最近新建了一批巨大的牛棚.这些牛棚构成了一个N*N的矩形网络.( ...
- bzoj4395[Usaco2015 dec]Switching on the Lights*
bzoj4395[Usaco2015 dec]Switching on the Lights 题意: n*n个房间,奶牛初始在(1,1),且只能在亮的房间里活动.每当奶牛经过一个房间,就可以打开这个房 ...
- 洛谷P2845-Switching on the Lights 开关灯
Problem 洛谷P2845-Switching on the Lights 开关灯 Accept: 154 Submit: 499Time Limit: 1000 mSec Memor ...
- FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...
随机推荐
- xshell 快捷键总结
##快捷键 linux tab == 命令补全,路径补全.如果tab不到,就代表对于当前用户环境系统找不到这个目录或者路径,有可能有,但是没有放在PATH中 ctrl + a == a:26个字母的第 ...
- laravel 报错The Mix manifest does not exist.
这是因为我们在 resources/views/layouts/app.blade.php 中使用 mix() 方法,而我们还未运行 Laravel Mix 进行编译,找不到 mix-manifest ...
- Cisco AP-Mobility Express基础
Part I 介绍 1.1基本概况 Cisco Mobility Express这个名词出现在Cisco “8”系列的AP上,例如现在的AP1852,AP2802,AP3802等都是Mobility ...
- mysql 默认信息
泰基MYSQL默认信息 登录名1-------默认用户 名字:root 密码:123 登录名2-------APP对应的数据库 名字:hotekey 密码:8888
- netty实现websocket客户端(附:测试服务端代码)
1,客户端启动类 package test3; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import ...
- Update(Stage4):Structured Streaming_介绍_案例
1. 回顾和展望 1.1. Spark 编程模型的进化过程 1.2. Spark 的 序列化 的进化过程 1.3. Spark Streaming 和 Structured Streaming 2. ...
- 【PAT甲级】1066 Root of AVL Tree (25 分)(AVL树建树模板)
题意: 输入一个正整数N(<=20),接着输入N个结点的值,依次插入一颗AVL树,输出最终根结点的值. AAAAAccepted code: #define HAVE_STRUCT_TIMESP ...
- python记录点
python记录点 文件编码 Unicode使用最少2个字节(1个字节=1BYTE=8bit=一个长度为8的二进制数) 来表示字母和符号等,有时候是4个字节. UTF-8是对Unicode编码的压缩和 ...
- 使用外网访问Flask项目
在学习flask过程中,想使用手机访问项目,根据flask手册中可以将 app.run(host='192.168.1.109', port=8000,debug=True) 但是发现手机依然无法连接 ...
- 时间选择器UIDatePicker的使用
UIDatePicker的介绍 UIDatePicker这个类的对象让用户可以在多个车轮上选择日期和时间.iPhone手机上的‘时钟’应用程序中的时间与闹铃中便使用了该控件.使用这个控件时,如果你能配 ...