\(\mathcal{Description}\)

  Link.

  在一张 \(n\times m\) 的网格图中有空格 . 和障碍格 #,\(q\) 次询问,每次查询从 \((x_1,y_1)\) 出发,是否能仅向下或向右走,在不经过障碍格的情况下走到 \((x_2,y_2)\)。

  \(n,m\le500\),\(q\le6\times10^5\)。

\(\mathcal{Solution}\)

  Trick 向的分治解法。

  不妨按行分治,设当前分治区间为 \([l,r]\),取中点 \(p\),则本层分治求解满足 \(l\le x_1\le p<x_2\le r\) 的所有询问(对于 \(x_1=x_2\) 的,特判即可)。记 \(f(i,j)\) 表示从 \((i,j)\) 出发,仅向下或向右走能到达的所有 \((p,k)\) 中 \(k\) 的集合(\(l\le i\le p\));对应地记 \(g(i,j)\) 表示从 \((i,j)\) 出发,仅向上或向左走能到达的所有 \((p,k)\) 中 \(k\) 的集合(\(p<i\le r\))。用 std::bitset 维护转移就能快速求解。

  复杂度 \(\mathcal O\left(\left(\frac{nm^2}{\omega}+q\right)\log n\right)\)。

\(\mathcal{Code}\)

/* Clearink */

#include <bitset>
#include <cstdio>
#include <vector> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) #define x1 my_x1
#define x2 my_x2
#define y1 my_y1
#define y2 my_y2 inline int rint() {
int x = 0, f = 1, s = getchar();
for ( ; s < '0' || '9' < s; s = getchar() ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = getchar() ) x = x * 10 + ( s ^ '0' );
return x * f;
} template<typename Tp>
inline void wint( Tp x ) {
if ( x < 0 ) putchar( '-' ), x = -x;
if ( 9 < x ) wint( x / 10 );
putchar( x % 10 ^ '0' );
} const int MAXN = 500, MAXQ = 6e5;
int n, m, q;
bool ans[MAXQ + 5];
char grid[MAXN + 5][MAXN + 5];
std::bitset<MAXN + 5> f[MAXN + 5][MAXN + 5]; struct Query { int x1, y1, x2, y2, id; };
std::vector<Query> allq; inline void solve( const int l, const int r, const std::vector<Query>& qry ) {
if ( qry.empty() ) return ;
int mid = l + r >> 1; per ( i, m, 1 ) {
if ( grid[mid][i] == '.' ) ( f[mid][i] = f[mid][i + 1] ).set( i );
else f[mid][i].reset();
}
rep ( i, 1, m ) { // save data in f[0] temporarily.
if ( grid[mid][i] == '.' ) ( f[0][i] = f[0][i - 1] ).set( i );
else f[0][i].reset();
} per ( i, mid - 1, l ) {
per ( j, m, 1 ) {
if ( grid[i][j] == '.' ) f[i][j] = f[i + 1][j] | f[i][j + 1];
else f[i][j].reset();
}
}
rep ( i, mid + 1, r ) {
rep ( j, 1, m ) {
if ( grid[i][j] == '.' ) {
f[i][j] = f[i == mid + 1 ? 0 : i - 1][j] | f[i][j - 1];
} else f[i][j].reset();
}
} if ( l == r ) {
for ( auto q: qry ) ans[q.id] = f[l][q.y1].test( q.y2 );
return ;
} std::vector<Query> lefq, rigq;
for ( auto q: qry ) {
if ( q.x2 <= mid ) lefq.push_back( q );
else if ( mid < q.x1 ) rigq.push_back( q );
else ans[q.id] = ( f[q.x1][q.y1] & f[q.x2][q.y2] ).any();
} solve( l, mid, lefq ), solve( mid + 1, r, rigq );
} int main() {
n = rint(), m = rint();
rep ( i, 1, n ) scanf( "%s", grid[i] + 1 );
allq.resize( q = rint() );
rep ( i, 0, q - 1 ) {
allq[i].x1 = rint(), allq[i].y1 = rint();
allq[i].x2 = rint(), allq[i].y2 = rint();
allq[i].id = i + 1;
} solve( 1, n, allq );
rep ( i, 1, q ) puts( ans[i] ? "Yes" : "No" );
return 0;
}

Solution -「CF 232E」Quick Tortoise的更多相关文章

  1. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  2. Solution -「CF 1622F」Quadratic Set

    \(\mathscr{Description}\)   Link.   求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...

  3. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  4. Solution -「CF 923E」Perpetual Subtraction

    \(\mathcal{Description}\)   Link.   有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...

  5. Solution -「CF 1586F」Defender of Childhood Dreams

    \(\mathcal{Description}\)   Link.   定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...

  6. Solution -「CF 1237E」Balanced Binary Search Trees

    \(\mathcal{Description}\)   Link.   定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...

  7. Solution -「CF 623E」Transforming Sequence

    题目 题意简述   link.   有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...

  8. Solution -「CF 1023F」Mobile Phone Network

    \(\mathcal{Description}\)   Link.   有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...

  9. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

随机推荐

  1. PaddleOCRSharp,2022年,你来的晚了些,一款.NET离线使用的高精度OCR

    一款免费且离线的.NET使用的OCR,爱你又恨你!恨你来的太晚了. PaddleOCRSharp 本项目是一个基于百度飞桨的PaddleOCR的C++代码修改并封装的.NET的类库.包含文本识别.文本 ...

  2. 微软开源Kubernetes服务网格项目Open Service Mesh​

    尽管微服务环境提供可移植性,允许更快更频繁的部署周期,甚至还能让组织创建关注于特定领域的团队,但这也伴随着对于流量管理.安全以及可观测性等需求的增长.在整个生态系统中,针对这些需求的服务网格模式的实现 ...

  3. 读《疯狂Java讲义》笔记总结一

    最近在读<疯狂Java讲义>,现把其中遇到的一些自己以前没掌握的点儿记录下来. 1.字符串相关 字符串不是基本类型,字符串是一个类,也就是一个引用类型. 字符串转int类型String a ...

  4. 解决nRF Connect for PC无法连接网络的问题(非FQ)

    各位小伙伴是不是也遇到过国内不能正常使用nRF Connect的问题,现在教大家一个十分有效的办法. 1.找到nrf connect的脚本配置文件"apps.json",默认在&q ...

  5. 地底,TypeScript和全球3D建筑发布于CesiumJS 1.70

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 2020年6月1日Cesium JS发布1.70 release ...

  6. Ajax_同源策略以及跨域问题

    Ajax_同源策略 同源策略是浏览器的一种安全策略, 同源指的是:协议.域名.端口.必须完全相同. 违背同源策略就是跨域. 而AJAX是默认遵循同源策略的: 同源说通俗一点呢就是页面跟获取请求的接口是 ...

  7. synergy最佳解决方案——barrier

    synergy最佳解决方案--barrier ​ 不知道大家有没有一套键盘鼠标控制多台电脑的需求,主流的硬件或说软件有大神整理如下: 软件方案: Windows 之间:Mouse Without Bo ...

  8. WebGPU 中消失的 VAO

    1 VAO 是 OpenGL 技术中提出来的 参考: 外链 其中有一段文字记录了 VAO 是什么: A Vertex Array Object (VAO) is an object which con ...

  9. golang中为何在同一个goroutine中使用无缓冲通道会导致死锁

    package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := ...

  10. python网络爬虫-解析网页(六)

    解析网页 主要使用到3种方法提取网页中的数据,分别是正则表达式.beautifulsoup和lxml. 使用正则表达式解析网页 正则表达式是对字符串操作的逻辑公式 .代替任意字符 . *匹配前0个或多 ...