[CF232E]Quick Tortoise
题目大意:
给你一个$n\times m(n,m\leq 500)$的格子,有一些是障碍物。从一个格子出发只能向下或向右走,有$q$组询问,每次询问从一个点是否能够到达另一个点。
思路:
分治。
两点间的路径必然会经过两点间的某条竖线。
我们可以二分一个区间内中间一条线$mid$,
对于$mid$左边的点,求出到$mid$为止往右下走能够到达的点,
对于$mid$右边的点,求出从$mid$开始往右下走会被哪些点到达。
这可以用bitdet来存。
对于不经过这条竖线的路径,可以往下递归查找。
回答询问时,只需要找到一开始选的两点之间的竖线,然后判一下一个点能到达的点和另一个点被到达的点有没有交集即可。
#include<cstdio>
#include<cctype>
#include<bitset>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
inline bool getblock() {
register char ch=getchar();
while(ch!='.'&&ch!='#') ch=getchar();
return ch=='.';
}
const int N=,logN=;
int n,m;
bool map[N][N];
std::bitset<N> f[N][N][logN],g[N][N][logN];
void solve(const int &l,const int &r,const int &k) {
if(l>r) return;
const int mid=(l+r)/;
solve(l,mid-,k+);
solve(mid+,r,k+);
for(register int i=n;i;i--) {
if(map[i][mid]) {
f[i][mid][k][i]=true;
f[i][mid][k]|=f[i+][mid][k];
}
for(register int j=mid-;j>=l;j--) {
if(map[i][j]) {
f[i][j][k]|=f[i+][j][k]|f[i][j+][k];
}
}
}
for(register int i=;i<=n;i++) {
if(map[i][mid]) {
g[i][mid][k][i]=true;
g[i][mid][k]|=g[i-][mid][k];
}
for(register int j=mid+;j<=r;j++) {
if(map[i][j]) {
g[i][j][k]|=g[i-][j][k]|g[i][j-][k];
}
}
}
}
int calc(const int &l,const int &r,const int &k,const int &y1,const int &y2) {
const int mid=(l+r)/;
if(y2<mid) return calc(l,mid-,k+,y1,y2);
if(y1>mid) return calc(mid+,r,k+,y1,y2);
return k;
}
inline bool check(const int &x1,const int &y1,const int &x2,const int &y2) {
if(x1>x2||y1>y2) return false;
const int k=calc(,m,,y1,y2);
return (f[x1][y1][k]&g[x2][y2][k]).count();
}
int main() {
n=getint(),m=getint();
for(register int i=;i<=n;i++) {
for(register int j=;j<=m;j++) {
map[i][j]=getblock();
}
}
solve(,m,);
for(register int q=getint();q;q--) {
const int x1=getint(),y1=getint(),x2=getint(),y2=getint();
puts(check(x1,y1,x2,y2)?"Yes":"No");
}
return ;
}
[CF232E]Quick Tortoise的更多相关文章
- cf232E. Quick Tortoise(分治 bitset dp)
题意 题目链接 Sol 感觉这个思路还是不错的 #include<bits/stdc++.h> using namespace std; const int MAXN = 501, SS ...
- CF232E Quick Tortoise , Fzoj 3118
这一题由于数据较多,我们考虑离线处理. 分治.对于两个点s,t,如果起点在mid这条横线上方,终点在下方,那么它必定会穿过mid这条线.所以只要s可以到mid上一点x,x可以到t,st就是安全的. 用 ...
- CodeForces 232E.Quick Tortoise
John Doe has a field, which is a rectangular table of size n × m. We assume that the field rows are ...
- Codeforces 232E - Quick Tortoise bitset+分治
题意: 思路: //By SiriusRen #include <cstdio> #include <bitset> #include <vector> using ...
- Solution -「CF 232E」Quick Tortoise
\(\mathcal{Description}\) Link. 在一张 \(n\times m\) 的网格图中有空格 . 和障碍格 #,\(q\) 次询问,每次查询从 \((x_1,y_1)\ ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- Quick Cocos (2.2.5plus)CoinFlip解析(MenuScene display AdBar二次封装)
转载自:http://cn.cocos2d-x.org/tutorial/show?id=1621 从Samples中找到CoinFlip文件夹,复制其中的 res 和 script 文件夹覆盖新建工 ...
- rsa密钥文件转化为tortoise认可的pak密钥文件
原贴地址: http://www.vectorns.com/blog/technical-articles/1-tortoisesvn-over-ssh-on-windows-via-putty Ne ...
- 《Qt Quick 4小时入门》学习笔记4
http://edu.csdn.net/course/detail/1042/14806?auto_start=1 Qt Quick 4小时入门 第七章:处理鼠标与键盘事件 1.处理鼠标事件 鼠标信号 ...
随机推荐
- python-成员修饰符
python的面相对象中,拥有3个成员,字段.方法.属性 class Foo: def __init__(self,name): #公有字段name在类中与类外均能调用 self.name = nam ...
- (转\整)UE4游戏优化 多人大地型游戏的优化(三)GPU的优化
施主分享随缘,评论随心,@author:白袍小道 小道暗语: 1.因为小道这里博客目录没自己整,暂时就用随笔目录结构,所以二级目录那啥就忽略了.标题格式大致都是(原or转) 二级目录 (标题) 2.因 ...
- 大图轮播js
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 团队Alpha版本(七)冲刺
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- OpenFlow-Enaling innvation in Campus Networks
OpenFlow-Enaling innvation in Campus Networks 出现问题 背景 Networks have become part of the critical infr ...
- Java 中xml解析
1.String 字符串保持到txt文件 String xml ="abcdefghijk"; FileWriter fw = null; File f = new File(&q ...
- 更优雅的清除浮动float方法
上篇文章是利用 :after 方法清除浮动float(作用于浮动元素的父元素上). ; } //为了兼容性,因为ie6/7不能使用伪类,所以加上此行代码. .outer:after {;;visibi ...
- P4342 [IOI1998]Polygon
题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符号+(加)或符号*(乘积)标记. 第一步,删除其中一条边 ...
- 全网把Map中的hash()分析的最透彻的文章,别无二家。
你知道HashMap中hash方法的具体实现吗?你知道HashTable.ConcurrentHashMap中hash方法的实现以及原因吗?你知道为什么要这么实现吗?你知道为什么JDK 7和JDK 8 ...
- 用$("...").attr("checked", true)设置勾选无效的原因
如下图所示,本来想要实现如下图所示的功能,于是我本来是使用$("...").attr("checked", true/false)来实现该功能,但是第一次点击时 ...