cf413E Maze 2D
The last product of the R2 company in the 2D games' field is a new revolutionary algorithm of searching for the shortest path in a 2 × nmaze.
Imagine a maze that looks like a 2 × n rectangle, divided into unit squares. Each unit square is either an empty cell or an obstacle. In one unit of time, a person can move from an empty cell of the maze to any side-adjacent empty cell. The shortest path problem is formulated as follows. Given two free maze cells, you need to determine the minimum time required to go from one cell to the other.
Unfortunately, the developed algorithm works well for only one request for finding the shortest path, in practice such requests occur quite often. You, as the chief R2 programmer, are commissioned to optimize the algorithm to find the shortest path. Write a program that will effectively respond to multiple requests to find the shortest path in a 2 × n maze.
The first line contains two integers, n and m (1 ≤ n ≤ 2·105; 1 ≤ m ≤ 2·105) — the width of the maze and the number of queries, correspondingly. Next two lines contain the maze. Each line contains n characters, each character equals either '.' (empty cell), or 'X' (obstacle).
Each of the next m lines contains two integers vi and ui (1 ≤ vi, ui ≤ 2n) — the description of the i-th request. Numbers vi, ui mean that you need to print the value of the shortest path from the cell of the maze number vi to the cell number ui. We assume that the cells of the first line of the maze are numbered from 1 to n, from left to right, and the cells of the second line are numbered from n + 1 to 2n from left to right. It is guaranteed that both given cells are empty.
Print m lines. In the i-th line print the answer to the i-th request — either the size of the shortest path or -1, if we can't reach the second cell from the first one.
4 7
.X..
...X
5 1
1 3
7 7
1 4
6 1
4 7
5 7
1
4
0
5
2
2
2
10 3
X...X..X..
..X...X..X
11 7
7 18
18 10
9
-1
3
这……线段树神题啊
但是这是道馆之战的弱化版……
道馆之战是树上的情况,这题只是一条链的情况
用线段树维护每一个1*2的格子从第一格能不能到第一格、从第一格能不能到第二格、从第二格能不能到第一格、从第二格能不能到第二格
#include<cstdio>
#include<iostream>
#define LL long long
#define inf 0x7ffffff
#define pa pair<int,int>
#define pi 3.1415926535897932384626433832795028841971
using namespace std;
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct segtree{
int l,r;
int a_to_a,a_to_b,b_to_a,b_to_b;
}tree[1000010];
segtree query;
bool mrk[2][200010];
int n,m,x0,y0,x1,y1;
segtree merge(segtree a,segtree b)
{
segtree k;
k.a_to_a=k.a_to_b=k.b_to_a=k.b_to_b=-1;
k.l=min(a.l,b.l); k.r=max(a.r,b.r); if (a.a_to_a!=-1&&b.a_to_a!=-1)k.a_to_a=a.a_to_a+b.a_to_a+1;
if (a.a_to_b!=-1&&b.b_to_a!=-1)
{
if (k.a_to_a==-1)k.a_to_a=a.a_to_b+b.b_to_a+1;
else k.a_to_a=min(k.a_to_a,a.a_to_b+b.b_to_a+1);
} if (a.a_to_a!=-1&&b.a_to_b!=-1)k.a_to_b=a.a_to_a+b.a_to_b+1;
if (a.a_to_b!=-1&&b.b_to_b!=-1)
{
if (k.a_to_b==-1)k.a_to_b=a.a_to_b+b.b_to_b+1;
else k.a_to_b=min(k.a_to_b,a.a_to_b+b.b_to_b+1);
} if (a.b_to_a!=-1&&b.a_to_a!=-1)k.b_to_a=a.b_to_a+b.a_to_a+1;
if (a.b_to_b!=-1&&b.b_to_a!=-1)
{
if (k.b_to_a==-1)k.b_to_a=a.b_to_b+b.b_to_a+1;
else k.b_to_a=min(k.b_to_a,a.b_to_b+b.b_to_a+1);
} if (a.b_to_a!=-1&&b.a_to_b!=-1)k.b_to_b=a.b_to_a+b.a_to_b+1;
if (a.b_to_b!=-1&&b.b_to_b!=-1)
{
if (k.b_to_b==-1)k.b_to_b=a.b_to_b+b.b_to_b+1;
else k.b_to_b=min(k.b_to_b,a.b_to_b+b.b_to_b+1);
}
return k;
}
inline void buildtree(int now,int l,int r)
{
tree[now].l=l;tree[now].r=r;
if (l==r)
{
tree[now].a_to_a=tree[now].a_to_b=tree[now].b_to_a=tree[now].b_to_b=-1;
if (mrk[0][l])tree[now].a_to_a=0;
if (mrk[1][l])tree[now].b_to_b=0;
if (mrk[0][l]&&mrk[1][l])
{
tree[now].a_to_b=1;
tree[now].b_to_a=1;
}
return;
}
int mid=(l+r)>>1;
buildtree(now<<1,l,mid);
buildtree(now<<1|1,mid+1,r);
tree[now]=merge(tree[now<<1],tree[now<<1|1]);
}
inline void work(int now,int x,int y)
{
int l=tree[now].l,r=tree[now].r;
if (l==x&&r==y)
{
if (!query.l)query=tree[now];
else query=merge(query,tree[now]);
return;
}
int mid=(l+r)>>1;
if (y<=mid)work(now<<1,x,y);
else if (x>mid)work(now<<1|1,x,y);
else
{
work(now<<1,x,mid);
work(now<<1|1,mid+1,y);
}
}
inline int ask(int x0,int y0,int x1,int y1)
{
query.l=query.r=0;
work(1,y0,y1);
if (!x0&&!x1)return query.a_to_a;
if (!x0&&x1)return query.a_to_b;
if (x0&&!x1)return query.b_to_a;
if (x0&&x1)return query.b_to_b;
}
int main()
{
n=read();m=read();
for(int i=0;i<=1;i++)
for(int j=1;j<=n;j++)
{
char ch=getchar();while (ch!='X'&&ch!='.')ch=getchar();
if (ch=='.')mrk[i][j]=1;
}
buildtree(1,1,n);
for(int i=1;i<=m;i++)
{
y0=read();y1=read();x0=x1=0;
if ((y0-1)%n+1>(y1-1)%n+1)swap(y0,y1);
if (y0>n){x0=1;y0-=n;}
if (y1>n){x1=1;y1-=n;}
printf("%d\n",ask(x0,y0,x1,y1));
}
}
cf413E Maze 2D的更多相关文章
- test20181005 迷宫
题意 分析 时间复杂度里的n,m写反了. 出题人很有举一反三的精神. 代码 我的代码常数巨大,加了各种优化后开O3最慢点都要0.9s. #include<cstdlib> #include ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- DFS经典题,reachable or not in a 2D maze
[[0, 0, 0, 0, 0, 1], [1, 1, 0, 0, 0, 1], [0, 0, 0, 1, 0, 0], [0, 1, 1, 0, 0, 1], [0, 1, 0, 0, 1, 0], ...
- LightOJ 1337 F - The Crystal Maze (bfs)
Description You are in a plane and you are about to be dropped with a parasuit in a crystal maze. As ...
- [LeetCode] The Maze III 迷宫之三
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- [LeetCode] The Maze II 迷宫之二
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- [LeetCode] The Maze 迷宫
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- Leetcode: The Maze III(Unsolved Lock Problem)
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- Leetcode: The Maze II
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
随机推荐
- linux mysql默认安装在哪个目录
MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为 Linux本身的目录结构就比 ...
- 微软在线测试题String reorder
问题描述: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB DescriptionFor this question, yo ...
- (转)利用ant在Mac 下自动化打包签名Android程序
1.创建一个android项目 参数说明:-k /--package 为命名空间(包名)-a /--name 工程名-p /--path 项目 -t 为目标平台的版本编号 命令:./android c ...
- 数据库系统原理及其应用总结---ShinePans
第一章 数据库概论 1.在数据库管理技术的发展过程中.数据库独立性最高的是"数据库系统"阶段 2.三大经典的数据结构模型是"关系.层次和网状模型" 3.单个用 ...
- Python进阶之路---1.5python数据类型-字符串
字符串 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; ...
- linux服务器内存占用太高-释放内存
修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档): Writing to this will cause the ke ...
- SUN-LDAP6.3_RHEL 5.0-卸载LDAP
卸载LDAP 1.注销服务器 到目录/ldap/ldapinstance/dscc6/bin下 # ./dsccreg remove-server -h 主机名 /ldap/ldapinstance/ ...
- Asp.Net 下载文件的几种方式
asp.net下载文件几种方式 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方法 ...
- 读取oracle页面或者进程卡住不动(死锁)
oracle最坑爹的地方:你insert update delete之后 或者kill死锁的时候记得一定要提交事务不然就是死锁卡在那里了 记住 kill死锁也是要提交事务的 select * ...
- 完整的Ajax实例
写在前面的话: 用了很久的Asp.Net Ajax,也看了段时间的jquery中ajax的应用,但到头来,居然想不起xmlHttpRequest的该如何使用了. 以前记的也不怎么清楚,这次就重新完整的 ...