CF232E Quick Tortoise , Fzoj 3118
这一题由于数据较多,我们考虑离线处理。
分治。对于两个点s,t,如果起点在mid这条横线上方,终点在下方,那么它必定会穿过mid这条线。所以只要s可以到mid上一点x,x可以到t,st就是安全的。
用bitset维护。设\(f1[i][j]\)为上方ij到mid这条线的是否可以的01值,\(f2[i][j]\)为下方ij到mid的01值。将f1[sx][sy]&f2[tx][ty],如果结果存在1,那么就能走到。
Codeforces版本
#include <cstdio>
#include <bitset>
#include <string>
#include <algorithm>
using namespace std;
const int S=505,N=600003;
int n,m,Q,fr[S],ed[S];
char a[S][S];
bitset<500> f[S][S],g[S][S],h;
bool res[N];
struct info
{
int x,y,X,Y,i;
}w[N];
void divdo(int l,int r)
{
if (l>r) return;
int mid=(l+r)>>1;
for (int i=m;i>=1;i--)
{
if (a[mid][i]=='0')
{
f[mid][i]=f[mid][i+1];
f[mid][i][i]=1;
}
else f[mid][i].reset();
}
for (int i=mid-1;i>=l;i--)
for (int j=m;j>=1;j--)
{
f[i][j].reset();
if (a[i][j]=='0')
{
if (a[i+1][j]=='0')
f[i][j]|=f[i+1][j];
if (a[i][j+1]=='0')
f[i][j]|=f[i][j+1];
}
}
for (int i=1;i<=m;i++)
{
if (a[mid][i]=='0')
{
g[mid][i]=g[mid][i-1];
g[mid][i][i]=1;
}
else g[mid][i].reset();
}
for (int i=mid+1;i<=r;i++)
for (int j=1;j<=m;j++)
{
g[i][j].reset();
if (a[i][j]=='0')
{
if (a[i-1][j]=='0')
g[i][j]|=g[i-1][j];
if (a[i][j-1]=='0')
g[i][j]|=g[i][j-1];
}
}
for (int i=fr[l];i<=ed[mid];i++)
{
if (mid<=w[i].X && w[i].X<=r)
{
h=f[w[i].x][w[i].y]&g[w[i].X][w[i].Y];
if (h.any())
res[w[i].i]=true;
}
}
divdo(l,mid-1);
divdo(mid+1,r);
}
void read(int &s)
{
s=0;char c=getchar();
while (c<'0' || c>'9') c=getchar();
while (c>='0' && c<='9') s=(s<<1)+(s<<3)+(c^48),c=getchar();
}
inline bool cmp(const info &a,const info &b)
{
return a.x<b.x;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%s",a[i]+1);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i][j]=='.')
a[i][j]='0';
else a[i][j]='1';
scanf("%d",&Q);
for (int i=1;i<=Q;i++)
{
read(w[i].x);
read(w[i].y);
read(w[i].X);
read(w[i].Y);
w[i].i=i;
}
sort(w+1,w+1+Q,cmp);
int ii=1;
for (int i=1;i<=n;i++)
{
while (ii<=Q && w[ii].x<=i)
ii++;
ed[i]=ii-1;
}
ii=Q;
for (int i=n;i>=1;i--)
{
while (ii>=1 && w[ii].x>=i)
ii--;
fr[i]=ii+1;
}
divdo(1,n);
for (int i=1;i<=Q;i++)
if (res[i]) puts("Yes");
else puts("No");
return 0;
}
Fzoj版本
#include <cstdio>
#include <bitset>
#include <string>
#include <algorithm>
using namespace std;
const int S=505,N=600003;
int n,m,Q,fr[S],ed[S];
char a[S][S];
bitset<500> f[S][S],g[S][S],h;
bool res[N];
struct info
{
int x,y,X,Y,i;
}w[N];
void divdo(int l,int r)
{
if (l>r) return;
int mid=(l+r)>>1;
for (int i=m;i>=1;i--)
{
if (a[mid][i]=='0')
{
f[mid][i]=f[mid][i+1];
f[mid][i][i]=1;
}
else f[mid][i].reset();
}
for (int i=mid-1;i>=l;i--)
for (int j=m;j>=1;j--)
{
f[i][j].reset();
if (a[i][j]=='0')
{
if (a[i+1][j]=='0')
f[i][j]|=f[i+1][j];
if (a[i][j+1]=='0')
f[i][j]|=f[i][j+1];
}
}
for (int i=1;i<=m;i++)
{
if (a[mid][i]=='0')
{
g[mid][i]=g[mid][i-1];
g[mid][i][i]=1;
}
else g[mid][i].reset();
}
for (int i=mid+1;i<=r;i++)
for (int j=1;j<=m;j++)
{
g[i][j].reset();
if (a[i][j]=='0')
{
if (a[i-1][j]=='0')
g[i][j]|=g[i-1][j];
if (a[i][j-1]=='0')
g[i][j]|=g[i][j-1];
}
}
for (int i=fr[l];i<=ed[mid];i++)
{
if (l<=w[i].x && w[i].x<=mid && mid<=w[i].X && w[i].X<=r)
{
h=f[w[i].x][w[i].y]&g[w[i].X][w[i].Y];
if (h.any())
res[w[i].i]=true;
}
}
divdo(l,mid-1);
divdo(mid+1,r);
}
void read(int &s)
{
s=0;char c=getchar();
while (c<'0' || c>'9') c=getchar();
while (c>='0' && c<='9') s=(s<<1)+(s<<3)+(c^48),c=getchar();
}
inline bool cmp(const info &a,const info &b)
{
return a.x<b.x;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%s",a[i]+1);
scanf("%d",&Q);
for (int i=1;i<=Q;i++)
{
read(w[i].x);
read(w[i].y);
read(w[i].X);
read(w[i].Y);
w[i].i=i;
}
sort(w+1,w+1+Q,cmp);
int ii=1;
for (int i=1;i<=n;i++)
{
while (ii<=Q && w[ii].x<=i)
ii++;
ed[i]=ii-1;
}
ii=Q;
for (int i=n;i>=1;i--)
{
while (ii>=1 && w[ii].x>=i)
ii--;
fr[i]=ii+1;
}
divdo(1,n);
for (int i=1;i<=Q;i++)
if (res[i]) puts("Safe");
else puts("Dangerous");
return 0;
}
CF232E Quick Tortoise , Fzoj 3118的更多相关文章
- [CF232E]Quick Tortoise
题目大意: 给你一个$n\times m(n,m\leq 500)$的格子,有一些是障碍物.从一个格子出发只能向下或向右走,有$q$组询问,每次询问从一个点是否能够到达另一个点. 思路: 分治. 两点 ...
- cf232E. Quick Tortoise(分治 bitset dp)
题意 题目链接 Sol 感觉这个思路还是不错的 #include<bits/stdc++.h> using namespace std; const int MAXN = 501, SS ...
- Visual Stuido 2010/2012 扩展:Quick Launcher,快速打开指定文件
Visual Stuido 2010/2012 扩展:Quick Launcher,快速打开指定文件 Quick Launcher 是一个极其简单但实用的 Visual Studio 扩展,支持 Vi ...
- 国产 WEB UI 框架 (收费)-- Quick UI,Mini UI
国产 WEB UI 框架 (收费)-- Quick UI,Mini UI : http://www.uileader.com/ http://www.miniui.com/
- 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 ...
- 没有Qt Quick UI,没有 Qt Quick Project
书上写的是File ‣ New File or Project ‣ Qt Quick Project ‣ Qt Quick UI 但实际上是File ‣ New File or Project ‣ O ...
- Solution -「CF 232E」Quick Tortoise
\(\mathcal{Description}\) Link. 在一张 \(n\times m\) 的网格图中有空格 . 和障碍格 #,\(q\) 次询问,每次查询从 \((x_1,y_1)\ ...
- Material风格的Quick组件,妈妈再也不用担心我的界面不好看了
https://github.com/papyros/qml-material http://www.zhihu.com/question/38523930
- Codeforces 232E - Quick Tortoise bitset+分治
题意: 思路: //By SiriusRen #include <cstdio> #include <bitset> #include <vector> using ...
随机推荐
- java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='
查询视图时报错:java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_ ...
- font-size-adjust属性定义及用法
font-size-adjust属性定义及用法 在css中,font-size-adjust属性是使用来更好的控制字体大小,当第一个选择的字体不可用时,浏览器使用第二个指定的字体,这可能会导致改变字体 ...
- bind-dns服务器搭建
环境:主服务器上IP为192.168.159.30 安装相关包bind dns服务器 bind-utils提供nslookup dig等命令 yum -y install bind bind-uti ...
- Github上的SlidingMenu菜单的使用方法
GitHub上的SlidingMenu的配置方法 1. 首先明确SlidingMenu是什么? 2. 如何使用SlidingMenu框架呢? GitHub上的SlidingMenu的配置方法 1. 首 ...
- Arrays(一)二次封装自己的数组
一.二次封装自己的数组 目标:设计int 类型数组, (1)可以根据用户传入的容量设置数组的长度,如果用户未设置容量,默认设置长度为10(考虑使用多态性) (2)判断数组是否为空 (3)获取数组的容量 ...
- 爬取猎聘大数据岗位相关信息--Python
猎聘网站搜索大数据关键字,只能显示100页,爬取这一百页的相关信息,以便做分析. __author__ = 'Fred Zhao' import requests from bs4 import Be ...
- appium 链接真机
1. 安装驱动 说明:如果驱动装不上,可以使用第三方的工具去安装.(一般来说还是用第三方) 这里推荐锤子科技的HandShaker, 地址:http://www.smartisan.com/apps/ ...
- gradle 排除jar
排除fastjson的包,其他同理compile('com.qq.sdk:core:2.0.3') { exclude group: 'com.alibaba'}
- 97、PageRank算法学习
最近由于.......你懂得,需要一些搜索方面的知识,于是乎我重新复习了一下上半年读的那本书<数学之美>Dr吴军老师写的. 感觉读完这种书还是写一下比较好,因为将来说不定就会忘记了. 接下 ...
- WebBrowser常用浏览操作
WebBrowser1.GoHome; //到浏览器默认主页 WebBrowser1.Refresh; //刷新 WebBrowser1.GoBack; //后退 WebBrowser1.GoForw ...