【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 ...
随机推荐
- Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; 没有sessionFactory
maven子项目spring配置文件创建bean 没有找到另一个子项目中的bean. 需要引入另一个子项目的配置文件,仅提供测试用 如下: <!-- 仅供测试用 --> <impor ...
- Linux自带mariadb卸载
MySQL安装过程中报错: dpkg: regarding mysql-community-server_5.6.39-1debian9_i386.deb containing mysql-commu ...
- thinkphp5,单图,多图,上传
/** * 上传单图 */ function upload($path, $filename) { $file = request()->file($filename); $info = $fi ...
- h5页面苹果端浮动问题
最近在开发一个h5的app端,前端同事写好页面,我们后端java动态化页面,测试的时候发现安卓端什么浏览器都正常如下图1,可是苹果端无论什么浏览器都出现了底部菜单缺少了两个下图2图一:正常显示 图2, ...
- Python的输入和输出问题详解
输出用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') pr ...
- python版opencv:如何用笔记本摄像头拍照保存
因为需要制作制作数据集 所以需要在笔记本上外置了一个logi的摄像头 准备使用python上得opencv来进行拍照 环境:opencv+pycharm+win10+py3 #coding:utf-8 ...
- MongoDB的Go语言驱动注意点
当我们定义一个struct用来和集合对应时,要注意结构体的字段首字母应该大写,不然不可见. 通过`bson:"name"`这种方式可以定义MongoDB中集合的字段名,如果不定义, ...
- Android MultiType第三方库的基本使用和案例+DiffUtil的简单用法
1.MultiType简单介绍 1.1.MultiType用于比较复杂的页面. 如下图,今日头条用到了MultiType处理各种复杂的页面. 这种还是比较简单的类型.因为一个页面也就这种类型. ...
- requestLayout 无效
今天,listview 的requestLayout 无效. 最后,我用了 getWindow().getDecorView().requestLayout(); 可以了.
- Android获取状态栏的高度:
方法一: //获取手机状态栏高度 public static int getStatusBarHeight(Context context){ Class<?> c = null; Obj ...