【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, ...
随机推荐
- PS--工具类
1.移动工具 快捷点Vctrl + 点击想要移动的图层.选中后,就可以移动了. 2.选取工具 快捷键M2.1选取后填充颜色:新建图层 选取 右键填充 添加前景色 2.2两块选区选择一个选区后,属性面板 ...
- Match & Catch CodeForces - 427D 后缀自动机水题
题意: 给出两个字符串a,b,求一个字符串,这个字符串是a和b的子串, 且只在a,b中出现一次,要求输出这个字符串的最小长度. 题解: 将a串放入后缀自动机中,然后记录一下每个节点对应的子串出现的次数 ...
- Neo4j Cypher查询语言详解
Cypher介绍 "Cypher"是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询.Cypher还在继续发展和成熟,这也就意味着有可能会出现 ...
- vue与webpack
由于最近在vue-cli生成的webpack模板项目的基础上写一个小东西,开发过程中需要改动到build和config里面一些相关的配置,所以刚好趁此机会将所有配置文件看一遍,理一理思路,也便于以后修 ...
- 修改ie版本为Edge
<meta http-equiv="X-UA-Compatible" content="IE=Edge"> #以上代码告诉IE浏览器,IE8/9及以 ...
- paper 15 :整理的CV代码合集
这篇blog,原来是西弗吉利亚大学的Li xin整理的,CV代码相当的全,不知道要经过多长时间的积累才会有这么丰富的资源,在此谢谢LI Xin .我现在分享给大家,希望可以共同进步!还有,我需要说一下 ...
- [JZOJ 5813] 计算
题意:求满足题意的方案数. 思路: 显然的计数类\(dp\). 不难发现,令$f(x) = \prod_{i=1}^{2m}{x_i} \(. 在找一个\)x'\(使得\)f(x') = \prod_ ...
- var 更明确地表示一个变量被设置为零值
创建一个变量并被初始化其为零值,习惯使用关键字var.这种做法是为了更明确地表示一个变量被设置为零值. 如果变量被初始化为某个非零值,就配合结构字面量和短变量操作符来创建变量. 零值 数值类型:0 字 ...
- 神经网络中使用Batch Normalization 解决梯度问题
BN本质上解决的是反向传播过程中的梯度问题. 详细点说,反向传播时经过该层的梯度是要乘以该层的参数的,即前向有: 那么反向传播时便有: 那么考虑从l层传到k层的情况,有: 上面这个 便是问题所在.因为 ...
- <爬虫实战>糗事百科
1.糗事百科段子.py # 目标:爬取糗事百科段子信息(文字) # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目 # 解析用学过的几种方法都实验一下①正则表达式.②Beauti ...