luogu4473 BZOJ2143 2011[国家集训队]飞飞侠
有问题可以在博客@
应该还会有人来看吧,嘻嘻
正题:
题目大意:
题目很清楚,就是一个点有一定的范围,会有一定的花费
求三个点中的任意两个点到另一个点的最小花费
(麻麻教育我千万读好题目(>_<)~)
思路
很容易想到跑最短路,但是建边的话,根本存不下来
所以我们直接存点的坐标,然后直接遍历范围内每个点就好了(遍历是看图找规律吧,反正我动脑子看不出来)
跑一边最短路就好了
bzoj完全没问题,这里指luogu
spfa?他好像又死了(o2水过)
堆优化迪杰斯特拉是个好东西
我是先写的spfa,然后改了改一丢丢就写成了迪杰斯特拉,感觉他俩好像啊
下面是dijkstar和死了的spfa
代码:堆优化迪杰斯特拉
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
#define maxn 155
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[maxn][maxn];
int b[maxn][maxn];
int dis[maxn][maxn];
int x[4],y[4];
int PKU[4][4];
struct node
{
int x,y,q;
node(int xx,int yy,int qq)
{
x=xx;y=yy;
q=qq;
}
bool operator < (const node &a) const
{
return q>a.q;
}
};
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {if(s=='-')f=-1;s=getchar();}
while('0'<=s&&s<='9') {x=(x<<3)+(x<<1)+s-'0';s=getchar();}
return x*f;
}
void dijstra(int js)
{
memset(dis,inf,sizeof(dis));
priority_queue<node> q;
q.push(node(x[js],y[js],0));
dis[x[js]][y[js]]=0;
while(!q.empty())
{
node u=q.top();
q.pop();
if(dis[u.x][u.y]!=u.q) continue;
int len=b[u.x][u.y];
int v=dis[u.x][u.y]+a[u.x][u.y];
for(int i=max(1,u.x-len);i<=min(n,u.x+len);++i)
{
int tmp=len-abs(u.x-i);
for(int j=max(1,u.y-tmp);j<=min(m,u.y+tmp);j++)
{
if(dis[i][j] > v)
{
dis[i][j] = v;
q.push(node(i,j,dis[i][j]));
}
}
}
}
for(int i=1;i<=3;++i) PKU[js][i]=dis[x[i]][y[i]];
}
int main(int argc, char const *argv[])
{
n=read();m=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
b[i][j]=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
a[i][j]=read();
for (int i = 1; i <= 3; ++i)
{
x[i]=read();
y[i]=read();
}
for(int i=1;i<=3;++i) dijstra(i);
int id=0,ans=inf;
for(int i=1;i<=3;++i)
{
int tm=PKU[1][i]+PKU[2][i]+PKU[3][i];
if(ans>tm) ans=tm,id=i;
}
if(ans==inf) return puts("NO"),0;
if(id==1) puts("X");
if(id==2) puts("Y");
if(id==3) puts("Z");
printf("%d",ans);
return 0;
}
代码:spfa
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iostream>
#define maxn 155
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int a[maxn][maxn];
int b[maxn][maxn];
int dis[maxn][maxn];
int vis[maxn][maxn];
int x[4],y[4];
int PKU[4][4];
struct node
{
int x,y;
node(int xx,int yy)
{
x=xx;y=yy;
}
};
inline int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {if(s=='-')f=-1;s=getchar();}
while('0'<=s&&s<='9') {x=(x<<3)+(x<<1)+s-'0';s=getchar();}
return x*f;
}
void spfa(int js)
{
memset(dis,inf,sizeof(dis));
queue<node> q;
q.push(node(x[js],y[js]));
dis[x[js]][y[js]]=0;
while(!q.empty())
{
node u=q.front();
q.pop();vis[u.x][u.y]=0;
int len=b[u.x][u.y];
int v=dis[u.x][u.y]+a[u.x][u.y];
for(int i=max(1,u.x-len);i<=min(n,u.x+len);++i)
{
int tmp=len-abs(u.x-i);
for(int j=max(1,u.y-tmp);j<=min(m,u.y+tmp);j++)
{
if(dis[i][j] > v)
{
dis[i][j] = v;
if(!vis[i][j])
{
vis[i][j]=1;
q.push(node(i,j));
}
}
}
}
}
for(int i=1;i<=3;++i) PKU[js][i]=dis[x[i]][y[i]];
}
int main(int argc, char const *argv[])
{
n=read();m=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
b[i][j]=read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
a[i][j]=read();
for (int i = 1; i <= 3; ++i)
{
x[i]=read();
y[i]=read();
}
for(int i=1;i<=3;++i) spfa(i);
int id=0,ans=inf;
for(int i=1;i<=3;++i)
{
int tm=PKU[1][i]+PKU[2][i]+PKU[3][i];
if(ans>tm)
{
ans=tm;
id=i;
}
}
if(ans==inf)
return puts("NO"),0;
if(id==1)
puts("X");
if(id==2)
puts("Y");
if(id==3)
puts("Z");
printf("%d",ans);
return 0;
}
厚颜无耻的骗波赞( • ̀ω•́ )✧
luogu4473 BZOJ2143 2011[国家集训队]飞飞侠的更多相关文章
- Luogu 4473 [国家集训队]飞飞侠
BZOJ 2143 新技能:并查集优化最短路. 暴力最短路是$O(n^4)$的,然后拿个线段树优化一下连边就$O($能过$)$了. 但是这样都太慢了. 我们考虑一个点如果之前被更新过了,那么之后就不会 ...
- happiness[国家集训队2011(吴确)]
[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...
- COGS1882 [国家集训队2011]单选错位
★ 输入文件:nt2011_exp.in 输出文件:nt2011_exp.out 简单对比时间限制:1 s 内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题 ...
- AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867
[国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...
- 刷题总结——飞飞侠(bzoj2143 最短路)
题目: Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街区.然而飞飞国是没有交通工具的.飞飞侠完全靠地面的弹射装置来移动.每个街 ...
- cogs 1901. [国家集训队2011]数颜色
Cogs 1901. [国家集训队2011]数颜色 ★★★ 输入文件:nt2011_color.in 输出文件:nt2011_color.out 简单对比时间限制:0.6 s 内存限制 ...
- BZOJ 2150 cogs 1861 [国家集训队2011]部落战争
题目描述 lanzerb的部落在A国的上部,他们不满天寒地冻的环境,于是准备向A国的下部征战来获得更大的领土. A国是一个M*N的矩阵,其中某些地方是城镇,某些地方是高山深涧无人居住.lanzerb把 ...
- 1893. [国家集训队2011]等差子序列(bitset)
★★ 输入文件:nt2011_sequence.in 输出文件:nt2011_sequence.out 简单对比时间限制:0.3 s 内存限制:512 MB [试题来源] 2011中国 ...
- BZOJ2143 飞飞侠 & [校内NOIP2018模拟20181026] 最强大脑
Time Limit: 50 Sec Memory Limit: 259 MB Description 飞飞国是一个传说中的国度,国家的居民叫做飞飞侠.飞飞国是一个N×M的矩形方阵,每个格子代表一个街 ...
随机推荐
- Python开发【算法】:斐波那契数列两种时间复杂度
斐波那契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, ...
- compass利用koala在chrome开启scss调试
compass不生成maps文件,所载调试css上,极不方便.看到下图的调试方式,怎么做. 利用用koala来解决,具体步骤如下: 1.确保自己安装了ruby和sass,compass.接着安装 co ...
- 淡入淡出(折叠效果)and点击切换背景图片
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- android 操作SD卡上的文件
(1)说明:操作SD卡上的文件须要增加下面权限 在SD卡上创建和删除文件权限 <uses-permission android:name="android.permission.M ...
- Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解
Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法.它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) mod p恒等于1.也就是对于所有小于p的正整数a来说 ...
- iphone传照片还是用QQ比较好
之前设置相机格式为高效,通过用91助手的苹果助手导出来文件格式为HEIC,window下没法打开.网上介绍用微信传,发现传的是缩略图,不清楚.最后选择通过qq传比较高清.注意,如果从相册中进行选择的话 ...
- go for cryptocurrency
https://blog.conformal.com/category/btcd/ https://github.com/btcsuite/btcd/tree/master/docs https:// ...
- SDUT1157:小鼠迷宫问题(bfs+dfs)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1157 题目描述 小鼠a与小鼠b身处一个m×n的 ...
- 2018-2019-2 网络对抗技术 20165324 Exp1:PC平台逆向破解
2018-2019-2 网络对抗技术 20165324 Exp1:PC平台逆向破解 实验: 要求: 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 掌握反汇编与十六进制编 ...
- CMPXCHG指令
一.CMPXCHG汇编指令详解. 这条指令将al\ax\eax\rax中的值与首操作数比较: 1.如果相等,第2操作数的直装载到首操作数,zf置1.(相当于相减为0,所以0标志位置位) 2.如果不等, ...