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 ...
随机推荐
- 【KMP】Oulipo
KMP算法 求串内匹配数,计数时返回next[]位置. Problem Description The French author Georges Perec (1936–1982) once wro ...
- zookeeper[3] zookeeper API开发注意事项总结
如下是根据官方接口文档(http://zookeeper.apache.org/doc/r3.4.1/api/org/apache/zookeeper/ZooKeeper.html#register( ...
- iOS单元测试(作用及入门提升)
由于只是一些简单实用的东西,学学还是挺不错的.其实单元测试用的好,开发起来也会快很多.单元测试对于我目前来说,就是为了方便测试一些功能是否正常运行,还有调试接口是否能正常使用.有时候你可能是为了测试某 ...
- javascript中的原型理解总结
经过几天研究查找资料,对原型终于有点理解了,今天就做下总结,不对之处,希望各位能够提出. 1.每一个Javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们今天所要总结的原 ...
- linux修改主机名-IP
1.查看当前主机名 hostname 2. ifconfig 显示所有网络接口的信息 ifconfig eth0 显示网卡eth0的信息 3.临时修改主机名 hostname rusky. ...
- Dev系列控件的AJAX (转)
介绍Dev系列控件在前台也就是客户端的一些常用方法介绍以及前后台异步通信的方法. 一.Dev Data Edit控件通用属性以及方法: 属性 1.GetEnabled():返回控件是否为可操作状态 2 ...
- JavaScript中函数参数的按值传递与按引用传递(即按地址传递)
首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址 ...
- 3.1,pandas【基本功能】
一:改变索引 reindex方法对于Series直接索引,对于DataFrame既可以改变行索引,也可以改变列索引,还可以两个一起改变. 1)对于Series In [2]: seri = pd.Se ...
- .NET中使用GridView控件输入数据时出现“ Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"的问题
在.NET中使用GridView控件的在线编辑数据时,出现了“ Index was out of range. Must be non-negative and less than the size ...
- JAVA中,JSON MAP LIST的相互转换
1 JSON包含对象和数组,对应于JAVA中的JSONObject,JSONArray 2 String 转JSON对象 JSONObject.fromObject("String" ...