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】迷宫的更多相关文章

  1. C语言动态走迷宫

    曾经用C语言做过的动态走迷宫程序,先分享代码如下: 代码如下: //头文件 #include<stdio.h> #include<windows.h>//Sleep(500)函 ...

  2. POJ 2251 Dungeon Master(3D迷宫 bfs)

    传送门 Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28416   Accepted: 11 ...

  3. BFS_Maze_求解迷宫最短路径

    /* 10 10 #.######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .## ...

  4. 【刷题笔记】I'm stuck! (迷宫)-----java方案

    题目描述 : 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此 ...

  5. canvas实例 ---- 制作简易迷宫(一)

    这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...

  6. HTML 迷宫

    今天补个遗,将很久以前研究 HTML5 的时候写的生成迷宫.迷宫寻路程序整理出来. 下载链接在文章最后. 简介 为什么要做这个 HTML5 迷宫程序?因为我喜欢.我愿意.也是向老程序员学习(见第5节) ...

  7. 洛谷P1605 迷宫——S.B.S.

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  8. Java迷宫游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树 ...

  9. 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, ...

随机推荐

  1. python调用tushare获取A股上市公司管理层人员信息

    接口:stk_managers 描述:获取上市公司管理层 注:tushare模块下载和安装教程,请查阅我之前的文章 积分:用户需要2000积分才可以调取,具体请参阅本文最下方积分获取办法 输入参数 名 ...

  2. 2018湘潭大学程序设计竞赛【E】

    题目链接:https://www.nowcoder.com/acm/contest/105/E 题意:给你美食种类和查询次数,告诉你美味度和价格,给你固定钱数,问你最多能吃到多少美味度的食物.(X真是 ...

  3. mac 常使用的一些小技巧

    全选 command +A 剪切 command + x 复制 ommand + c 粘贴 command + v 撤销 command + z 聚焦搜索 command + 空格 退出全屏窗口 Co ...

  4. 代码托管平台--GitHub 使用小结

    一.GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管.在GitHub,用户可以十分轻易地找到海量的开源代码. 很多IT行业的人到求职的 ...

  5. C/C++通用Makefile

    最近的项目又回到了Linux上运行,这就需要在Linux下编译项目,写Makefile针对习惯了Windows的程序员来说是一件痛苦的事,如果有一个通用的Makefile该多好啊,本着这样的目的,我再 ...

  6. Centos 安装php Imagick 扩展

    从 centos 仓库安装 首先安装 php-pear php-devel,gcc三个软件包 yum install php-pear php-devel gcc 通过 yum 安装Centos 官方 ...

  7. Atcoder arc092

    E-Both Sides Merger 给你一个序列,支持两种操作,直到序列中只有一个数时停下来,使得剩下数最大,并输出选数方案. 操作1:扔掉一个最前端或最后端的元素.操作2:选取一个不在边界上的元 ...

  8. vue导出table内容至excel——转

    一:在项目中需要安装2个依赖项,如下命令: npm install --save file-saver xlsx 二:在vue文件中如下使用即可: <template> <div c ...

  9. Dubbo从拜师到入坟

    第一个Dubbo程序:Hello world 创建业务接口工程 我们将这个接口单独抽取出来,打成jar包被多个服务锁依赖 创建服务提供者Provider Provider工程的pom文件如下: < ...

  10. 常用Jquery前端操作

    input只能输入正整数 onkeyup="this.value=this.value.replace(/\D/g,'')" if(!confirm("删除后无法恢复,确 ...