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 ...
随机推荐
- String path = request.getContextPath();报错
String path = request.getContextPath();报错 1. 右击该项目 - Build Path - Configure Build Path , 在 Libraries ...
- sql中简单的触发器功能
触发器分为DML触发器和DDL触发器DML触发器包含After触发器,执行insert update delete语句后会触发after触发器,会事务回滚DML触发器还包含instead of触发器, ...
- MVC MVC3中 ViewBag、ViewData和TempData的使用和区别 【转】
在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...
- Memory Analyzer Tool定位Java heap space内存泄漏
java heap space是一个很蛋疼的问题,如果开发调试时遇到还好,如果是在项目上线后运行一段时间后,才抛出该异常,那真的很悲剧(那你得找代码中到底是哪里内存泄露了),这真是一个悲伤的故事. 1 ...
- 51nod1340地铁环线
经典题. 经典差分约束模型. 但是 显然这个总长是有上下界的. 直接二分总长,判断有没有负环 如果没有负环好办,有负环就不知道怎么偏了. 因为没有单调性! (如果所有没有单调性的函数图像,都知道往哪里 ...
- ZROI week6
ZROI week6 T1 用一个类似背包的东西记录答案. T2 好像直接用|操作即可. T3 瞎搞就完事了 T4 启发式合并,然而变量写错了,就没了... 总结 100 + 100 + 100 + ...
- HTML-参考手册: HTML 事件属性
ylbtech-HTML-参考手册: HTML 事件属性 1.返回顶部 1. HTML 事件属性 全局事件属性 HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某 ...
- rsync+inotify实现实时同步案例
转自:http://chocolee.blog.51cto.com/8158455/1400596 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐 ...
- 用processing画李萨如曲线
李萨如曲线 有没有对示波器上变化曲线产生过兴趣,它叫做李萨如曲线: 数学上,利萨茹(Lissajous)曲线(又称利萨茹图形.李萨如图形或鲍迪奇(Bowditch)曲线)是两个沿着互相垂直方向的正弦振 ...
- python学习笔记:接口开发——PythonWEB框架之Flask
Flask是一个使用 Python 编写的轻量级 Web 应用框架,安装命令如下 pip install flask 一.服务端接口是怎么开发的? 1.启动一个服务 2.接收到客户端传过来的数据3.登 ...