【CZY选讲·棋盘迷宫】
题目描述
一个N*M的棋盘,’.’表示可以通过,’#’表示不能通过,给出Q个询问,给定起点和终点,判断两点是否联通,如联通输出“Yes”,否则输出“No”。
数据范围
N,M <=500,Q <=10^6。
题解:
①由于存在两个方向和不可逆性,标记联通分量的方法不可行
②分治算法。按照行将棋盘一分为二,进行DP处理:
用f[i][j]表示点(i,j)与中线上每个点的联通性,可用bitset压位处理。
转移方程式:f[i][j]=f[i][j+1]|f[i+1][j]
③离线询问,将询问随着分治区间而分开处理。
④时间复杂度: O(n2*logn)
#include <cstdio>
#include <vector>
#include <bitset>
using std::vector;
using std::bitset;
const int QUERY_SIZE = 600006;
const int MAP_SIZE = 511; int N, M, Q;
char map[MAP_SIZE][MAP_SIZE];
int ans[QUERY_SIZE];
bitset<MAP_SIZE> f[MAP_SIZE][MAP_SIZE], g[MAP_SIZE][MAP_SIZE];
struct query {
int x1, y1, x2, y2, id;
}; query q;
void solve(vector<query> v, int l, int r) {
int m = (l + r) >> 1;
if (l > r) return ;
for (int i = m; i >= l; i--)
for (int j = M; j >= 1; j--) {
f[i][j] = 0;
if (map[i][j] == '.') {
if (i == m) f[i][j].set(j);
else f[i][j] |= f[i + 1][j];
if (j != M) f[i][j] |= f[i][j + 1];
}
}
for (int i = m; i <= r; i++)
for (int j = 1; j <= M; j++) {
g[i][j] = 0;
if (map[i][j] == '.') {
if (i == m) g[i][j].set(j);
else g[i][j] |= g[i - 1][j];
if (j != 1) g[i][j] |= g[i][j - 1];
}
}
vector<query> vl, vr;
for (vector<query>::iterator it = v.begin(); it != v.end(); it++) {
q = *it;
if (q.x2 < m) vl.push_back(q);
else if (q.x1 > m) vr.push_back(q);
else ans[q.id] = (f[q.x1][q.y1] & g[q.x2][q.y2]).any();
}
solve(vl, l, m - 1);
solve(vr, m + 1, r);
} int main() {
freopen("boardgame.in", "r", stdin);
freopen("boardgame.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 1; i <= N; i++)
scanf("%s", map[i] + 1);
vector<query> v;
scanf("%d", &Q);
for (int i = 0; i < Q; i++) {
scanf("%d %d %d %d", &q.x1, &q.y1, &q.x2, &q.y2);
q.id = i;
v.push_back(q);
}
solve(v, 1, N);
for (int i = 0; i < Q; i++)
puts(ans[i] ? "Yes" : "No");
return 0;
}//czy020202
那神秘的光芒像暴风雨般凛冽着,大地在无情的追问中幻灭成挽歌,
如梦的迷雾随着诗篇消逝在远山…… ————————————汪峰《信仰在空中飘扬》
【CZY选讲·棋盘迷宫】的更多相关文章
- 【CZY选讲·Hja的棋盘】
题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...
- 【CZY选讲·吃东西】
题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 【CZY选讲·最大子矩阵和】
题目描述 有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大. 数据范围 n,m<=300. 题解: ①如果没有p,那么二维矩阵和就是一维最长 ...
- 【CZY选讲·Yjq的棺材】
题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...
- 【CZY选讲·逆序对】
题目描述 LYK最近在研究逆序对. 这个问题是这样的. 一开始LYK有一个2^n长度的数组ai. LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设 n=4,k= ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- 【CZY选讲·扩展LCS】
题目描述 给出两个仅有小写字母组成的字符串str1 和str2,试求出两个串的最长公共子序列. 数据范围 |str1| ⩽ 1000; |str2| ⩽ 10^6 题解: ①直接进行LCS( ...
- 【CZY选讲·次大公因数】
题目描述 给定n个数ai,求sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an). 其中sgcd(x,y)表示x和y的次大公因数.若不存在次大公因数,sgcd(x,y)=-1 ...
随机推荐
- webkit几种内核版本的优劣对比总结
01.Open-Webkit-Sharp 默认不存在JS对话框,如果需要显示alert box,则需要在ShowJavaScriptAlertPanel进行捕捉,然后显示对话框: 02.Open-We ...
- hibernate映射实体类查询时数据库空字段赋值给实体类报错的问题
因为一直报实体类空异常,去网上查了资料只查到了并没有查到数据库空值时不给实体类赋值的属性 异常 org.hibernate.InvalidMappingException: Could not par ...
- PHP continue和break的用法(深入理解)
对于刚入门的PHP童鞋们来说,在循环体中的continue和break的作用总是分不清到底是什么意思, 怎么用, 两者到底有什么区别? 接下来说几个例子,其实它们是很好区分的. <?php $t ...
- P1338 末日的传说 逆序数对
题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡,人们都采用一种奇特的方式记 ...
- mybatis <forEach>标签的使用
MyBatis<forEach>标签的使用 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis.当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名 ...
- RHCE考试
RHCSA_PDF版传送门:https://files.cnblogs.com/files/zhangjianghua/RHCSA%E8%AF%95%E9%A2%98.pdf RHCE_PDF版传送门 ...
- 理解Queue队列中join()与task_done()的关系
在网上大多关于join()与task_done()的结束原话是这样的: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 ...
- CNN:
(1)卷积:对图像元素的矩阵变换,是提取图像特征的方法,多种卷积核可以提取多种特征.一个卷积核覆盖的原始图像的范围叫做感受野(权值共享).一次卷积运算提取的特征往往是局部的,难以提取出比较全局的特征, ...
- 你的第一个自动化测试:Appium 自动化测试
前言: 这是让你掌握 App 自动化的文章 一.前期准备 本文版权归作者和博客园共有,原创作者:http://www.cnblogs.com/BenLam,未经作者同意必须在文章页面给出原文连接. 1 ...
- Oracle 学习----游标(使用带参光标cursor)
--表参照无参光标页信息 --注意:红色就是参数 declare cursor tt(pkeycode temp.keycode%type) is select name,sal from temp ...