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的矩形方阵,每个格子代表一个街 ...
随机推荐
- Nginx日志切割之Logrotate篇
不管是什么日志文件,都是会越来越大的,大到一定程度就是个可怕的事情了,所以要及早的做处理,方法之一就是按时间段来存储,不过linux系统提供了Logrotate的日志管理工具,很好用,不用写计划任务脚 ...
- vue - 组件的创建
组件的创建 vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使 ...
- LightOj 1118 - Incredible Molecules(两圆的交集面积)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1118 给你两个圆的半径和圆心,求交集的面积: 就是简单数学题,但是要注意acos得到的 ...
- 【Python】如何切换浏览器的tap页?
当点击浏览器当前页面中的某个链接后自动弹出一个新的浏览器的tap页面时,浏览器正常都会在当前操作的tap页面右1位置打开新弹出的tap页. 当前selenium还不具备自动切换页面后窗口切换功能.需要 ...
- ListView多种item注意以及自己出现的莫名其妙的错误
如果ListView不懂,请绕路 1.ListView添加多个item必须用到的两个方法 getViewTypeCount一共有多少种item,我这里写的两种 getItemViewType当前pos ...
- InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能
InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync repl ...
- 003-redis-命令-key操作,字符串操作
Redis 键(key) Redis 键命令用于管理 redis 的键. 序号 命令及描述 1 DEL key该命令用于在 key 存在时删除 key. 2 DUMP key 序列化给定 key ,并 ...
- 解决FileInputStream读取文本时 最后端会多出字符问题
使用 read(byte[]) 方法读取文本的时候,要用 String str = new String(byte[],int offset,int len) 来将数组中的元素转换为String字符串 ...
- 处理hash冲突
“处理冲突” 的实际含义是: 为产生冲突的地址寻找下一个哈希地址. 1. 开放定址法 2. 链地址法 ------------------------------------------------- ...
- webpack 3 & React 的配置 。
今天真是难过的一天