这一题由于数据较多,我们考虑离线处理。

分治。对于两个点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的更多相关文章

  1. [CF232E]Quick Tortoise

    题目大意: 给你一个$n\times m(n,m\leq 500)$的格子,有一些是障碍物.从一个格子出发只能向下或向右走,有$q$组询问,每次询问从一个点是否能够到达另一个点. 思路: 分治. 两点 ...

  2. cf232E. Quick Tortoise(分治 bitset dp)

    题意 题目链接 Sol 感觉这个思路还是不错的 #include<bits/stdc++.h> using namespace std; const int MAXN = 501, SS ...

  3. Visual Stuido 2010/2012 扩展:Quick Launcher,快速打开指定文件

    Visual Stuido 2010/2012 扩展:Quick Launcher,快速打开指定文件 Quick Launcher 是一个极其简单但实用的 Visual Studio 扩展,支持 Vi ...

  4. 国产 WEB UI 框架 (收费)-- Quick UI,Mini UI

    国产 WEB UI 框架 (收费)-- Quick UI,Mini UI : http://www.uileader.com/ http://www.miniui.com/

  5. 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 ...

  6. 没有Qt Quick UI,没有 Qt Quick Project

    书上写的是File ‣ New File or Project ‣ Qt Quick Project ‣ Qt Quick UI 但实际上是File ‣ New File or Project ‣ O ...

  7. Solution -「CF 232E」Quick Tortoise

    \(\mathcal{Description}\)   Link.   在一张 \(n\times m\) 的网格图中有空格 . 和障碍格 #,\(q\) 次询问,每次查询从 \((x_1,y_1)\ ...

  8. Material风格的Quick组件,妈妈再也不用担心我的界面不好看了

    https://github.com/papyros/qml-material http://www.zhihu.com/question/38523930

  9. Codeforces 232E - Quick Tortoise bitset+分治

    题意: 思路: //By SiriusRen #include <cstdio> #include <bitset> #include <vector> using ...

随机推荐

  1. python--前端之CSS

    CSS产生背景: 为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此思想而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠样式表. 有了C ...

  2. 07-图5 Saving James Bond - Hard Version(30 分)

    This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...

  3. SCP-bzoj-1057

    项目编号:bzoj-1057 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 首先枚举最左上角的点(记为(1,1))是黑点还是白点,这样就可以把与(1,1)不在同一对角线系的格点颜色翻转(形式 ...

  4. selenium IDE 安装环境配置

  5. JavaScript 获取时间,时间戳

    一. 动态获取js时间 1.方法一:最简单的写法,直接输出时间到页面 <!DOCTYPE html> <html> <head> <title>< ...

  6. Java第四次作业—面向对象高级特性(继承和多态)

    Java第四次作业-面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能,说 ...

  7. VTemplate模板引擎的使用--高级篇

    VTemplate模板引擎的使用--高级篇 在网站中,经常会有某个栏目的数据在多个页面同时使用到.比如新闻网站或电子商务网站的栏目列表,几乎在很多页面都会显示栏目导航.对于这种多个页面同时使用到的“数 ...

  8. memcached 安装与简单实用使用

    一.简介 1.memcache与memcached的区别与联系: memcache是php的拓展,memcached是客户端,复杂的说:Memcache模块提供了于memcached方便的面向过程及面 ...

  9. apache虚拟主机配置及解析

    Apache虚拟主机配置及解析 1.修改httpd-vhosts.conf 打开apache(Apache24)/conf/extra/httpd-vhosts.conf文件,添加虚拟主机信息,可以这 ...

  10. Dayjs处理时间函数的插件

    现在很多处理时间格式化的插件,我平时项目中最常用的便是Dayjs这个插件,我觉得这个插件还是很好用的.现在说一下这个插件的基本使用. Dayjs并没有覆盖Javascript原生的Date.proto ...