【JZOJ6293】迷宫
description

analysis
有没有想起【\(NOIP2018\)】保卫王国?
设\(tr[t][x][y]\)表示线段树上的\(t\)节点代表的区间,从最左边列的\(x\)行到最右边列\(y\)行的最小距离
当区间长度为\(1\)时预处理很简单,注意向上走和向下走
合并两个区间\(2t,2t+1\)成\(t\)时,枚举中转点\(z\),\(tr[t][x][y]=min(tr[2t][x][z]+tr[2t+1][z][y]+1)\)
对其实这个很像弗洛伊德的\(DP\),就是拿两个区间拼起来
查询就线段树上面合并出一个大区间,然后就可以直接知道答案
修改就修改某个叶子节点代表的区间,重新处理数据,再向上合并
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 200005
#define INF 1000000007
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
using namespace std;
ll a[6][MAXN];
bool bz[6][MAXN];
ll n,m,q;
struct node
{
ll f[6][6];
}tr[MAXN<<2],tmp;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline void clear(node &tmp,ll pos)
{
fo(i,1,n)fo(j,1,n)tmp.f[i][j]=INF;
fo(i,1,n)
{
if (bz[i][pos])tmp.f[i][i]=0;
fd(j,i-1,1)if (bz[j][pos] && tmp.f[i][j+1]<INF)tmp.f[i][j]=tmp.f[i][j+1]+1;else break;
fo(j,i+1,n)if (bz[j][pos] && tmp.f[i][j-1]<INF)tmp.f[i][j]=tmp.f[i][j-1]+1;else break;
}
}
inline node merge(node a,node b)
{
node c;
fo(i,1,n)fo(j,1,n)c.f[i][j]=INF;
fo(k,1,n)fo(i,1,n)fo(j,1,n)
c.f[i][j]=min(c.f[i][j],a.f[i][k]+b.f[k][j]+1);
return c;
}
inline void build(ll t,ll l,ll r)
{
if (l==r)
{
clear(tr[t],l);
return;
}
ll mid=(l+r)>>1;
build(t<<1,l,mid),build((t<<1)+1,mid+1,r);
tr[t]=merge(tr[t<<1],tr[(t<<1)+1]);
}
inline void modify(ll t,ll l,ll r,ll x,ll y)
{
if (l==r)
{
clear(tr[t],l);
return;
}
ll mid=(l+r)>>1;
if (x<=mid)modify(t<<1,l,mid,x,y);
else modify((t<<1)+1,mid+1,r,x,y);
tr[t]=merge(tr[t<<1],tr[(t<<1)+1]);
}
inline node query(ll t,ll l,ll r,ll x,ll y)
{
if (l==x && y==r)return tr[t];
ll mid=(l+r)>>1;
if (y<=mid)return query(t<<1,l,mid,x,y);
else if (x>mid)return query((t<<1)+1,mid+1,r,x,y);
else return merge(query(t<<1,l,mid,x,mid),query((t<<1)+1,mid+1,r,mid+1,y));
}
int main()
{
//freopen("T1.in","r",stdin);
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
n=read(),m=read(),q=read();
fo(i,1,n)fo(j,1,m)bz[i][j]=(a[i][j]=read());
build(1,1,m);
while (q--)
{
ll opt=read(),x=read(),y=read(),xx,yy;
if (opt==1)bz[x][y]^=1,modify(1,1,m,y,x);
else
{
xx=read(),yy=read();
if (!bz[x][y] || !bz[xx][yy]){printf("-1\n");continue;}
tmp=query(1,1,m,y,yy);
printf("%lld\n",tmp.f[x][xx]<INF?tmp.f[x][xx]:-1ll);
}
}
return 0;
}
【JZOJ6293】迷宫的更多相关文章
- C语言动态走迷宫
曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- BFS_Maze_求解迷宫最短路径
/* 10 10 #.######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .## ...
- 【刷题笔记】I'm stuck! (迷宫)-----java方案
题目描述 : 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此 ...
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- HTML 迷宫
今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...
- 洛谷P1605 迷宫——S.B.S.
题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...
- Java迷宫游戏
缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...
- K - 迷宫问题
/*定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, ...
随机推荐
- 并发新构件之PriorityBlockingQueue:优先阻塞队列
PriorityBlockingQueue:优先阻塞队列:是带有优先级的阻塞队列,一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作.虽然此队列逻辑上是无 ...
- 修改css样式+jq中的效果+属性操作+元素操作
:checked 选框选中的 一.修改css样式: 1.参数只写属性名,则返回属性值 $(this).css( ' color '); //300px 2.参数是属性名,属性值,逗号分隔,是 ...
- Django项目 BBS论坛
BBS论坛 一.项目表分析 二.自定义form组件 三.注册功能 四.BBS论坛 登录功能
- 构建单页Web应用——简单概述
一.开发框架 ExtJS可以称为第一代单页应用框架的典型,它封装了各种UI组件,用户主要使用JavaScript来完成整个前端部分,甚至包括布局.随着功能逐渐增加,ExtJS的体积也逐渐增大,即使用于 ...
- 笔记45 Hibernate快速入门(二)
Hibernate O/R 映射 一.多对一 一个Product对应一个Category,一个Category对应多个Product,所以Product和Category是多对一的关系.使用hiber ...
- http/tcp/ip/端口
http是www服务器和本地浏览器之间传输超文本的协议. 每一台机器都有一个属于自己的ip地址,计算机也需要知道是哪个程序来接受信息,这里也就引入了端口号,可以简单地理解每一个程序都有一个唯一的端口号 ...
- SolidWorks直线命令快捷转换为圆弧命令
在进行草图绘制的时候,有时候需要切换到圆弧命令,此时来回切换比较麻烦, 我们可以将鼠标回碰线段起点,此时便成为了圆弧工具. 再次回碰,可改变圆心方向 利用鼠标操作,快捷切换绘图工具.
- shell脚本明文密码隐藏且加密
将密码放到文件中去,比如/root/.pass.txtpassword=`</root/.pass.txt`还怕密码泄露的话,就把pass.txt权限设置下. chattr +i /root/. ...
- Redis缓存数据库常见操作
Jedis的最为常见的操作.主要包括常用的列表(list).集合(set).有序集合(sorted set).哈希表(hash)等数据结构,以及其他特性支持. 参考资料:http://hello-ni ...
- css导行下拉动画
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...