BZOJ3161 : 孤舟蓑笠翁
显然求出每个点到所有关键点的最短路和次短路即可,答案就是每个关键点的次短路。
设$f[i][j][0]$表示左手在$i$,右手在$j$的解,$f[i][j][1]$表示左手在$i$,右手在$j$,且左手已经动了右手还没开始动的解,然后BFS即可。
时间复杂度$O(n(n+m))$。
#include<cstdio>
const int N=1010,M=10010;
int n,m,K,dmi,dma,i,j,k,x,y,z,vip[N][N],ans[N*N],e[2][N],v[M],nxt[M],ed,h,t,q[N*N*4][5];
struct P{int x,y;P(){}P(int _x,int _y){x=_x,y=_y;}}a[N],f[N][N][2],g[N][N][2];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;}
inline int abs(int x){return x>0?x:-x;}
inline bool check(int x,int y){
int d=abs(a[x].x-a[y].x)+abs(a[x].y-a[y].y);
return dmi<=d&&d<=dma;
}
inline void ext(int x,int y,int z,int a,int b){
if(!z&&!check(x,y))return;
if(g[x][y][z].y)return;
if(f[x][y][z].y==b)return;
q[++t][0]=x,q[t][1]=y,q[t][2]=z,q[t][3]=a,q[t][4]=b;
if(!f[x][y][z].y)f[x][y][z]=P(a,b);else g[x][y][z]=P(a,b);
}
int main(){
read(n),read(m),read(dmi),read(dma);
for(i=1;i<=n;i++)read(a[i].x),read(a[i].y);
read(K);
for(i=1;i<=K;i++)read(x),read(y),vip[x][y]=i;
while(m--){
read(x),read(y),read(z);
add(e[z][x],y),add(e[z][y],x);
}
for(i=1;i<=n;i++)add(e[0][i],i),add(e[1][i],i);
for(h=i=1;i<=n;i++)for(j=1;j<=n;j++)if(vip[i][j])ext(i,j,0,0,vip[i][j]);
while(h<=t){
x=q[h][0],y=q[h][1],z=q[h][2],j=q[h][3]+1-z,k=q[h++][4];
for(i=e[z][z?y:x];i;i=nxt[i])ext(z?x:v[i],z?v[i]:y,z^1,j,k);
}
for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(vip[i][j])ans[vip[i][j]]=g[i][j][0].y?g[i][j][0].x:-1;
for(i=1;i<=K;i++)printf("%d\n",ans[i]);
return 0;
}
BZOJ3161 : 孤舟蓑笠翁的更多相关文章
- C# Tcp协议收发数据
运行这个程序前需要先关闭Windows防火墙,Win7系统关闭防火墙的方法是在控制面板的“控制面板\系统和安全\Windows 防火墙\自定义设置”路径中,将“家庭或工作(专用)网络位置设置”和“公用 ...
- 零基础学Python--------第4章 序列的应用
第4章 序列的应用 4.1序列 序列是一块用于存放多个值的连续内存空间,并且按上一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以取出相应的值.例如,我们可以把一家酒店看 ...
- 三、Python-列表
一.序列:是一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值 索引:从左到右的索引从0开始依次增加的正整数:从右到左的索引为-1开始的复数 切片(分片):一中获取序列中的元素的方 ...
- 简单的C#TCP协议收发数据示例
参考:http://www.cnblogs.com/jzxx/p/5630516.html 一.原作者的这段话很好,先引用一下: Socket的Send方法,并非大家想象中的从一个端口发送消息到另一个 ...
- Kotlin 型变 + 星号投影(扯蛋)
Kotlin中的型变: 1. in,顾名思义,就是只能作为传入参数的参数类型 2.out, ..............,就是只能作为返回类型参数的参数类型 星号投影: 我们引用官网的吧-- For ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- python学习笔记(十六)之文件
打开文件用open函数 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=Tru ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [bzoj3160]万径人踪灭_FFT_Manacher
万径人踪灭 bzoj-3160 题目大意:给定一个ab串.求所有的子序列满足:位置和字符都关于某条对称轴对称而且不连续. 注释:$1\le n\le 10^5$. 想法: 看了大爷的题解,OrzOrz ...
随机推荐
- iOS系类教程之用instruments来检验你的app
比较了好多关于instruments 还是发现老外写的比较牛逼.于是果断翻译过来.有能力的的可以去看英文原版,鼓励大家看原版资料远离二手教程.这里是原文 入门 为了节省大家的时间,提供一个演示的D ...
- LR性能指标分析
Memory: ·Available Mbytes 简述:可用物理内存数.如果Available Mbytes的值很小(4 MB或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存. 参考值 ...
- Python中如何读取xls中的数据
要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd 安装方法:下载解压后,利用windows dos命令进入解压目录eg,c ...
- 使用HttpWebRequest发送自定义POST请求
平时用浏览器看网页的时候,点击一下submit按钮的时候其实就是给服务器发送了一个POST请求.但是如何在自己的C#程序里面实现类似的功能呢?本文给出了一个简单的范例,可以实现类似的和web serv ...
- VC++6.0使用OpenGL前的配置(必看)
要在VC++6.0中使用opengl,需要配置一下环境设置. 具体需要两步: 1.加入一个头文件,两个lib文件,两个dll文件,放在合适位置. 2.配置一下vc++6.0的Project Setti ...
- dblink
drop database link "STANDARD"; drop database link "CSPS" --创建dblink create dat ...
- subversion安装使用
这里仅针对subversion进行说明,未完待续. 一.下载subversion并安装: a.subversion 要做svn服务器的必须装 b.Tortoisesvn 仅仅是访问svn服务器的客户端 ...
- PHP+MYSQL+AJAX实现每日签到功能
一.web前端及ajax部分 文件index.html <html> <head> <meta http-equiv=Content-Type content=" ...
- C++读取txt文件
1. 逐行读入 void readTxt(string file) { ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 asser ...
- 单例模式/singleton模式/创建型模式
Java实现要点: 私有构造方法 线程安全(并发的考虑) 延迟加载(效率的考虑,对于较大的类在使用时在加载) 公有方法访问单一实例 常见单例模式代码及问题 //无延迟加载,常驻内存(即使不使用) cl ...