[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.处理鼠标事件 鼠标信号 ...
随机推荐
- python3编写脚本之--------购物车
我这里的购物车的大概内容是: 1.首先要知道商品的有什么东西可卖,需要多少钱. 2.买家准备花多少钱去购物商品,购买的商品先放在购物车里. 3.最后买家还可以是否确定购买购物车的东西,还剩多 ...
- NOIP2018 集训(二)
A题 神炎皇 问题描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 \((a,b)\) ,若满足 \(a+b\leq n\) 且 \(a+b\) 是 \(ab\) 的因子,则称 为神 ...
- python学习总结 --函数基础
函数基础 ### 函数简介 - 定义:具有特定功能的一段代码 - 优点: - 可以减少代码的重复书写 - 可以将功能的实现着和使用者分开,可以提高开发效率 - 分类: - 库函数:print.inpu ...
- (笔记) RealTimeRender[实时渲染] C2
@author: 白袍小道 @来源:RealTime Render @建议书籍:龙书.RealTimeR第四版.GPUGem和PRO (来源:暗影不解释) 引点 这一章关注的管线中的管道功能,而非实现 ...
- linux shell常用语法
特殊变量 $0 当前脚本的文件名$n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2.$# 传递给脚本或函数的参数个数.$* 传递给脚本或函数的所有参 ...
- 提取URL字符串的搜索字符串中的参数
function urlArgs() { var args = []; var query = location.search.substring(1); var paris = query.spli ...
- ACdream 1029 前缀和
Multiplication Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Subm ...
- hdu6188&&百度之星初赛(B) T5
度度熊的交易计划 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生 ...
- 一种提高Android应用进程存活率新方法
一.基础知识 1.Android 进程优先级 1.1 进程优先级等级一般分法:- Activte process- Visible Process- Service process- Backgrou ...
- 一种机制,与js类似
我们知道,当两个条件进行逻辑与操作的时候,其中任何一个条件为假,则表达式的结果为假.所以,遇到(A 且 B)这种表达式,如果A为假的话,B是不是真假都无所谓了,当遇到一个假条件的时候,程序也就没有必要 ...