[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.处理鼠标事件 鼠标信号 ...
随机推荐
- 【转载】Unity3D研究院transform.parent = parent坐标就乱了
昨天有朋友问我了一个问题,它将Hierarchy视图里的某个子节点下的GameObject拷贝到另外一个对象的子节点下面,他使用的方法就是 transform.parent = parent 但是拷贝 ...
- 一个符号冲突导致的core分析
问题描述: 修改跟踪程序(Trace)支持IPV6时,发现程序启动后正常,但是客户端一旦下发查询条件进行跟踪,Trace程序就直接coredump! (gdb) bt # 0x00007f7dab9e ...
- PHP如何实现第三方分享
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- 网络--路由表&IP选路
路由表的 flags 字段显示路由状态: A 活动的休眠网关检测在路由上被启用.本字段只适用于 AIX 5.1 或更新版本. U :Up. H :路由至主机而不是网络. G :路由至网关. 不带G表示 ...
- JSP/Servlet Web 学习笔记 DayOne
JSP概述 1)JSP是一种动态网页技术标准,它是在传统的页面HTML文件中插入Java程序段和JSP标记(tag),从而形成JSP文件(*.jsp),也称JSP页面. 2)JSP容器是一个支持JSP ...
- table不让td中文字溢出操作方法
table不让td中文字溢出操作方法 table{ width:100px; table-layout:fixed;/* 只有定义了表格的布局算法为fixed,下面td的定义才能起作用. */ } t ...
- objective-c runtime 开发详情
目录 概述 对象与类的实质 id与class 继承关系与isa 总结 C函数创建一个OC类 OC类与runtime NSObjectProtocol NSObject NSProxy 一.概述 Obj ...
- 关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商)
关于ECDSA/ECC(密钥加密传输)和ECDSA/ECDH(密钥磋商) 来源: https://blog.csdn.net/xueyepiaoling/article/details/6243337 ...
- hihoCoder #1902 字符替换
解法 这题比赛时过的人很多,我却没思路,糊里糊涂写了个强联通分量,得了 80 分. 这题思路是这样的. 一个替换操作可以看做一个有向边,所以题目实际上给出了一个有向图 $G$,一个节点代表一个字母. ...
- oracle的隐式游标
游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...