[POI2013]Morskie opowieści
[POI2013]Morskie opowieści
题目大意:
一个\(n(n\le5000)\)点\(m(m\le5000)\)边无向图,边权均为\(1\),有\(k(k\le10^6)\)个询问。
每次询问给出\((s,t,d)\),要求回答是否存在一条从\(s\)到\(t\)的路径(可以自交),长度为\(d\)。
思路:
我们只需要求出两点间的奇最短路和偶最短路,询问时根据\(k\)的奇偶性,与最短路作比较,超过的部分可以在任意两点间绕。
时间复杂度\(\mathcal O(n^2+q)\),空间复杂度\(\mathcal O(n^2)\)。
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=5001;
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
bool vis[2][N];
int n,dis[N][2][N];
std::queue<std::pair<bool,int> > q;
inline void bfs(const int &s,int dis[2][N]) {
std::fill(&vis[0][1],&vis[0][n]+1,false);
std::fill(&vis[1][1],&vis[1][n]+1,false);
std::fill(&dis[0][1],&dis[0][n]+1,INT_MAX);
std::fill(&dis[1][1],&dis[1][n]+1,INT_MAX);
dis[0][s]=0;
vis[0][s]=true;
q.push(std::make_pair(0,s));
while(!q.empty()) {
const bool &t=q.front().first;
const int &x=q.front().second;
for(register unsigned i=0;i<e[x].size();i++) {
const int &y=e[x][i];
if(vis[!t][y]) continue;
if(dis[t][x]+1<dis[!t][y]) {
dis[!t][y]=dis[t][x]+1;
vis[!t][y]=true;
q.push(std::make_pair(!t,y));
}
}
q.pop();
}
}
int main() {
n=getint();
const int m=getint(),q=getint();
for(register int i=0;i<m;i++) {
add_edge(getint(),getint());
}
for(register int i=1;i<=n;i++) bfs(i,dis[i]);
for(register int i=0;i<q;i++) {
const int x=getint(),y=getint(),k=getint();
if(x==y&&k%2==0) {
if(e[x].size()) {
puts(dis[x][k&1][y]<=k?"TAK":"NIE");
} else {
puts(k==0?"TAK":"NIE");
}
continue;
}
puts(dis[x][k&1][y]<=k?"TAK":"NIE");
}
return 0;
}
这样在洛谷上是能过的,但是在BZOJ和SZKOpuł上过不了,因为原题的空间限制是128MB。
发现\(dis(i,j)=dis(j,i)\),所以dis
数组的内存可以减小一半。
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=5001;
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
bool vis[2][N];
int n;
std::vector<int> dis[N][2];
std::queue<std::pair<bool,int> > q;
inline int &dist(const int &x,const bool &t,const int &y) {
return dis[std::max(x,y)][t][std::min(x,y)];
}
inline void bfs(const int &s) {
dis[s][0].resize(s+1);
dis[s][1].resize(s+1);
std::fill(&vis[0][1],&vis[0][n]+1,false);
std::fill(&vis[1][1],&vis[1][n]+1,false);
for(register int i=1;i<=n;i++) {
dist(s,0,i)=dist(s,1,i)=INT_MAX;
}
dist(s,0,s)=0;
vis[0][s]=true;
q.push(std::make_pair(0,s));
while(!q.empty()) {
const bool &t=q.front().first;
const int &x=q.front().second;
for(register unsigned i=0;i<e[x].size();i++) {
const int &y=e[x][i];
if(vis[!t][y]) continue;
if(dist(s,t,x)+1<dist(s,!t,y)) {
dist(s,!t,y)=dist(s,t,x)+1;
vis[!t][y]=true;
q.push(std::make_pair(!t,y));
}
}
q.pop();
}
}
int main() {
n=getint();
const int m=getint(),q=getint();
for(register int i=0;i<m;i++) {
add_edge(getint(),getint());
}
for(register int i=n;i>=1;i--) bfs(i);
for(register int i=0;i<q;i++) {
const int x=getint(),y=getint(),k=getint();
if(x==y&&k%2==0) {
if(e[x].size()) {
puts(dist(x,0,y)<=k?"TAK":"NIE");
} else {
puts(k==0?"TAK":"NIE");
}
continue;
}
puts(dist(x,k&1,y)<=k?"TAK":"NIE");
}
return 0;
}
于是在SZKOpuł上卡过去了,但是在BZOJ被卡T了。
题解上的做法是将询问离线后,按照\(x\)排序,每次如果遇到新的\(x\)重新BFS即可。
时间复杂度\(\mathcal O(n^2+q\log q)\),空间复杂度\(\mathcal O(n+q)\)。
[POI2013]Morskie opowieści的更多相关文章
- Travis CI用来持续集成你的项目
这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...
- CI Weekly #10 | 2017 DevOps 趋势预测
2016 年的最后几个工作日,我们对 flow.ci Android & iOS 项目做了一些优化与修复: iOS 镜像 cocoapods 版本更新: fir iOS上传插件时间问题修复: ...
- CI Weekly #9 | 揭秘阿里 Docker 化实践之路
2017年悄然而至,对 flow.ci 你有什么新的期待呢?新的一年,flow.ci会越来越强大好用,希望继续得到你的支持与反馈.最近,我们做了如下的「功能优化」与「问题修复」,看看有没有你想要的: ...
- CI Weekly #8 | CI/CD 技能进阶路线
在使用 flow.ci 进行持续集成的过程中,也许你会遇到一些小麻烦.最近我们整理了一些常见问题在 flow.ci 文档之 FAQ,希望对你有用.如果你遇到其他问题,也可以通过「在线消息」或去 Git ...
- CI Weekly #7 | Instgram/Quora 等大公司如何做持续部署?
终于,你们期待的 flow.ci iOS 项目持续集成 开始公测了.在这几个工作日, flow.ci 做了些许「功能优化」与「问题修复」,性能和体验都在持续优化中.比如: iOS 快速入门文档更新: ...
- CI Weekly #6 | 再谈 Docker / CI / CD 实践经验
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- CI Weekly #5 | 微服务架构下的持续部署与交付
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
- php使用CI发送qq和163邮件
1.需求 发送邮件 2.介绍 使用CI框架的email类库发送邮件,这里演示QQ和163 3.163使用教程 a.先去163邮件开启smtp邮件. b.在CI的控制器里写下面的代码 $this-> ...
- 【补充】Gitlab 部署 CI 持续集成
上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...
随机推荐
- 转载自知乎大神---this 的值到底是什么?一次说清楚
你可能遇到过这样的 JS 面试题: var obj = { foo: function(){ console.log(this) } } var bar = obj.foo obj.foo() // ...
- [转载]jdk环境变量配置方法
JDK下载 在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用,下面教大家如何配置jdk环境变量: 1.右键选择 计算机→属性→高级系统设置→高级→环境变量 2.系统变量→新建 变量名:J ...
- 20155328 2016-2017-2 《Java程序设计》第六周 学习总结
20155328 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 根据不同的分类标准,IO可分为:输入/输出流:字节/字符流:节点/处理流. 在不使用Inpu ...
- 机器学习&深度学习视频资料汇总
第一部分 基础语言 pandax视频教程 链接: https://pan.baidu.com/s/1pLqavVX 密码: fath python入门到精通 链接: https://pan.b ...
- RPC笔记之初探RPC:DIY简单RPC框架
一.什么是RPC RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用. rpc原理其实很简单,比较容易理解,在r ...
- 优化MySQL的21个建议 – MySQL Life【转】
今天一个朋友向我咨询怎么去优化 MySQL,我按着思维整理了一下,大概粗的可以分为21个方向. 还有一些细节东西(table cache, 表设计,索引设计,程序端缓存之类的)先不列了,对一个系统,初 ...
- 点击超链接打开本地QQ
2014年6月4日 10:20:18 张志斌 这个功能实际上是属于腾讯的推广项目"一键加群"功能: http://qun.qq.com/join.html 用户必须有自己的群,登录 ...
- php毫秒时间戳
2014年5月23日 17:46:04 凡事还是得靠自己呀,网上太多坑 如果你的机器是 32位 的可以看这个: list($usec, $sec) = explode(' ', microtime() ...
- 钉钉机器人-实现监控通知功能-python
1. 首先得创建有 一个 钉钉群.(因为只能发群通知) 2. 添加机器人,得到一个url: 3. 开始写Python脚本: # -*- coding: utf-8 -*- ""&q ...
- 20165330《网络对抗技术》Exp0 Kali安装
Kali安装 下载地址 Kali官网 VMware 安装步骤 参考在虚拟机中安装kali linux 安装Kali Linux的镜像和VMware 打开VMware,选择文件-新建虚拟机,出现对话框选 ...