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 ...
随机推荐
- poi各种jar包作用和导入
poi各种jar包作用和导入 目前POI的最新发布版本是poi-bin-3.17-20170915. 下载地址: Apache POI - Download Release Artifacts ht ...
- sparql学习sparql示例、dbpedia在线验证
sparql学习sparql示例.dbpedia在线验证 导言 作为sparql群的群主,自己也不太懂sparql,竟然意外接到了一份作业.好久没有接活了.主要就是复习了一下各个语言怎么写.记录一下, ...
- VPS性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench和压力测试
现在便宜的VPS主机越来越多了,一些美国的VPS主机甚至给出1美元一月的VPS,堪比虚拟主机还要便宜,巨大的价格优势吸引不少人购买和使用,而近些年来国内的主机商也开始意识到便宜的VPS对草根站长的诱惑 ...
- Micro SQL Server2016
Microsoft SQL Server 2016 序列号(中英文通用) SQL Server 2016 企业版: MDCJV-3YX8N-WG89M-KV443-G8249SQL Server 2 ...
- Java中深度克隆和浅度克隆
一:使用目的: 就是为了快速构造一个和已有对象相同的副本.如果需要克隆对象,一般需要先创建一个对象,然后将原对象中的数据导入到新创建的对象中去,而不用根据已有对象进行手动赋值操作. 二:Object中 ...
- php的闭包函数use的使用
PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字. function getMoney() { $rmb = 1; $dollar = 6; $fun ...
- Neo4j高级应用技术专题系列 - APOC存储过程库-【1】概述
Neo4j高级应用技术专题系列 - APOC存储过程库-[1]概述 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://bl ...
- idea部署tomcat项目时,在项目里打断点不能拦截
以下内容都是基于我自己的项目(如未解决道友们的问题,请别介意) idea部署tomcat项目时,在项目里打断点不能拦截,工作中遇到的问题,记录一下(tomcat6) 当项目的以下内容配置完毕后,启动项 ...
- es7 async 前置依赖
https://stackoverflow.com/questions/33527653/babel-6-regeneratorruntime-is-not-defined 移动端 px2rem-lo ...
- Javascript高级程序设计--读书笔记之面向对象(二)
前面讲了面向对象的封装,这章我们就来说一说继承 1.原型链 实现原型链有一种基本模式,其代码大概如下 <script> function SuperType(){ this.propert ...