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. EF 线程内唯一对象

    ef 做了很多修改后一起提交 增 删 改查 也就是相应的操作后不提交最后一起提交 在Dal层创建一个 EF上下文工厂 public class DBContextFactory { public st ...

  2. git config配置,工作区和版本库联系。

    关于git和github的介绍,我这边不多说. 使用在windows下使用git,需要配置环境变量,也可以使用git自带的终端工具.,打开git bash laoni@DESKTOP-TPPLHIB ...

  3. 面向连接的echo服务编程实例

    以下是echo_serv.c的源码,提供创建服务端,绑定套接字到本机IP的8080端口,当收到客户端发送的字符串就在屏幕上打印出来,并且把字符串发送给客户端 // echo_serv.c – gcc ...

  4. hadoop–JobTracker 相关

    JobTracker 内部使用三层表示: JobInProgress: 跟踪和监控作业运行状态的对象.每个Job分成了多个Task.并为每个Task创建一个TaskInProgress跟踪和监控其运行 ...

  5. C中为什么不能用==比较字符串?

    通常的回答是,==比较的不是字符串的内容,它是在比较指针.或者说,==(或者!=)仅比较两个字符串的首地址,而不会比较字符串每个字符. 那其实接下来应该问的问题是,为什么会只比较首地址呢? 因为早期的 ...

  6. JMM 内存模型 与 volatile 关键字

    内存模型 线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory). 本地内存中存储了该线程以读/写共享变量的副本. 不同线程之间无法相互 ...

  7. 01二重退背包+组合数学——cf1111d

    退背包进阶,还是挺难想的 /* dp1[k]表示取到体积k的方案数 dp2[i][j][k]表示左侧必选ij的情况下,取到体积k的方案数 dp2[i][j][k]=dp1[k]-左侧不选ij的方案数 ...

  8. Delphi 2010下使用sqlitesimpledelphi连接SQLite数据库及中文乱码问题的解决

    应女朋友的要求,要写一款销售管理的软件.用于管理服装店每天的销售记录,已及管理服装店的客户,并对客户进行生日提醒 因为之前使用C#写过一款家庭管理软件,主要是自己用,所以使用了服务器型数据库MySQL ...

  9. xcode5 添加Build Phases脚本

    http://www.runscriptbuildphase.com/ 版权声明:本文为博主原创文章,未经博主允许不得转载.

  10. [C#]记录一次异常排查,关于using语法、sqlserver数据库session、DBHelper类

    最近在做一个基于asp.net和sqlserver的网站项目,发现网站运行一段时间之后,会报异常: 超时时间已到,但是尚未从池中获取连接.出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小 ...