题面

题解

我们可以总结出球的两种状态,要么自己飞,要么在球员脚下被带飞。

自己飞的情况下,他只能单向直线运动,每一步代价为A,被带飞可以乱走,每一步代价为C。

从自己飞到被带飞需要一个距离自己最近的球员过来,代价为 ,对于每个格点,这个代价都是确定的,因为球不可能两次到同一个球员脚下,所以球员就相当于一次性的工具人,输入后bfs处理 就可以了。

从被带飞到自己飞需要踢一脚,给它自由,代价为B。

那么我们可以把每个格点拆成5个点,然后建个图。

自己飞要四个点,分别表示四个方向,每个点朝那个方向的下一个同类点连一条单向边,权值为A,这样就可以模拟出单向运动了。

被带飞就需要单独一个点,向四个方向的带飞点连双向边,权值为C,这样球就可以乱走了。

自己飞的四个点向被带飞的一个点分别连一条单向边,权值为 ,表示球员跑过来,把它带飞。

被带飞的一个点向自己飞的四个点分别连一条单向边,权值为 B,表示分别向四个方向踢一脚的情况。

这样就可以直接求最短路了。

不推荐用 Slow Path Finding Algorithm。

CODE

注意,实际行数列数是 ≤ 501 的,总共有 251001 个点,特别坑

#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<cmath>
#include<bitset>
#include<iostream>
#define MAXN 251010
#define LL long long
#define ULL unsigned LL
#define rg register
#define lowbit(x) (-(x) & (x))
#define ENDL putchar('\n')
#define DB double
#define bs bitset<105>
//#pragma GCC optimize(2)
//#pragma G++ optimize(3)
//#define int LL
using namespace std;
char char_read_before = 1;
inline int read() {
int f = 1,x = 0;char s = char_read_before;
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 - '0' + s;s = getchar();}
char_read_before = s;return x * f;
}
template<typename T__>
inline T__ Abs(T__ x) {return x < 0 ? -x:x;}
int zxy; // 用来膜的
int n,m,i,j,s,o,k,h,w,N,S,T;
int x[MAXN],y[MAXN];
int dpp[505][505];
bool v[505][505];
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
struct itn{
int x,y,s;
itn(){x=y=s=0;}
itn(int X,int Y,int S){x=X;y=Y;s=S;}
};
queue<itn> b;
int L,R,U,D;
LL A,B,C;
struct it{
int v;
LL w;
it(){v=w=0;}
it(int V,LL W){v = V;w = W;}
};
vector<it> g[MAXN*5];
LL dp[MAXN*5] = {(LL)1e18};
bool f[MAXN*5];
inline int I(int x,int y) {return (x-1)*w + y;}
inline int bing(int a,int b) {return dp[a] < dp[b] ? a:b;}
int tre[MAXN*20],M;
inline void mt(int n){M=1;while(M < n+2) M <<= 1;}
inline void addt(int x,int y) {
int s = M+x;tre[s] = y;s >>= 1;
while(s) tre[s] = bing(tre[s<<1],tre[s<<1|1]),s >>= 1;
}
inline int allt() {return tre[1];}
void dij() {
mt(N*5);
dp[S] = 0;
addt(S,S);
for(int i = 1;i < N*5;i ++) {
int t = allt();
if(!t) break;
f[t] = 1;
for(int j = 0;j < g[t].size();j ++) {
if(!f[g[t][j].v]) {
dp[g[t][j].v] = min(dp[g[t][j].v],dp[t] + g[t][j].w);
addt(g[t][j].v,g[t][j].v);
}
}
addt(t,0);
}
}
signed main() {
h = read()+1;w = read()+1;
N = h*w;
A = read();B = read();C = read();
n = read();
for(int i = 1;i <= n;i ++) {
x[i] = read()+1;y[i] = read()+1;
dpp[x[i]][y[i]] = 0;
v[x[i]][y[i]] = 1;
b.push(itn(x[i],y[i],0));
}
while(!b.empty()) {
itn t = b.front();
b.pop();
for(int i = 0;i < 4;i ++) {
itn t1(t.x + dx[i],t.y + dy[i],t.s + 1);
if(t1.x < 1 || t1.y < 1 || t1.x > h || t1.y > w || v[t1.x][t1.y]) continue;
dpp[t1.x][t1.y] = t1.s;
v[t1.x][t1.y] = 1;
b.push(t1);
}
}
S = I(x[1],y[1])+4*N;
T = I(x[n],y[n])+4*N;
for(int i = 1;i <= h;i ++) {
for(int j = 1;j <= w;j ++) {
LL pd = dpp[i][j]*C;
int d1 = I(i,j),d2 = d1 + N,d3 = d2 + N,d4 = d3 + N,d5 = d4 + N;
dp[d1] = dp[d2] = dp[d3] = dp[d4] = dp[d5] = (LL)1e17;
if(i > 1) {
g[d1].push_back(it(I(i-1,j),A));
g[d5].push_back(it(I(i-1,j)+4*N,C));
}
if(i < h) {
g[d2].push_back(it(I(i+1,j)+N,A));
g[d5].push_back(it(I(i+1,j)+4*N,C));
}
if(j > 1) {
g[d3].push_back(it(I(i,j-1)+2*N,A));
g[d5].push_back(it(I(i,j-1)+4*N,C));
}
if(j < w) {
g[d4].push_back(it(I(i,j+1)+3*N,A));
g[d5].push_back(it(I(i,j+1)+4*N,C));
}
g[d1].push_back(it(d5,pd));
g[d2].push_back(it(d5,pd));
g[d3].push_back(it(d5,pd));
g[d4].push_back(it(d5,pd)); g[d5].push_back(it(d1,B));
g[d5].push_back(it(d2,B));
g[d5].push_back(it(d3,B));
g[d5].push_back(it(d4,B));
}
}
dij();
printf("%lld\n",dp[T]);
return 0;
}

[JOI 2017 Final] 足球 (建图,最短路)的更多相关文章

  1. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  2. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  3. uva10067 Playing with Wheels 【建图+最短路】

    题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...

  4. 【建图+最短路】Bzoj1001 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  5. CodeForces 786B Legacy(线段树优化建图+最短路)

    [题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...

  6. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  7. G. 神圣的 F2 连接着我们 线段树优化建图+最短路

    这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...

  8. 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)

    Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...

  9. BZOJ 4289: PA2012 Tax 差分建图 最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html  ...

随机推荐

  1. c++ FHQ Treap

    前面我们对平衡树有了个大概的了解 关于 Treap Treap=Binary Search Tree + Heap 二叉搜索树 + 二叉堆(一般是小根堆) Treap 每一个节点有两个值 一个值是平衡 ...

  2. Markdown常见基本语法

    标题 -方式一:使用警号 几个警号就是几级标题,eg: # 一级标题 -方式二: 使用快捷键 ctrl+数字 几级标题就选其对应的数字, eg: ctrl+2(二级标题) 子标题 -方式一: 使用星号 ...

  3. 介绍一个好用的dao层与mybatis互跳的idea插件MyBatisCodeHelperPro

    一次点击 File--> Settings --> Plugins -->搜索MyBatisCodeHelperPro,点击获取,重启idea即可 接下来看效果,点击小企鹅就可以相互 ...

  4. 基于bat脚本的前端发布流程的优化

    背景介绍 前面在基于bat脚本的前端发布流程设计与实现中,我已经介绍了设计与实现,这一篇主要是针对其的一个优化折腾(分两步走,第一步先搞出来,第二步再想着怎么去优化它),我主要做了以下几件事. &qu ...

  5. UiPath键盘操作的介绍和使用

    一.键盘操作的介绍 模拟用户使用键盘操作的一种行为: 例如使用发送热键(Sendhotkey),输入信息 (Typeinto)的操作 二.键盘操作在UiPath中的使用 1.打开设计器,在设计库中新建 ...

  6. SQL报了一个不常见的错误,让新来的实习生懵了

    摘要:前些天一个很简单的SQL报了一个不常见的错误. 本文分享自华为云社区<记一次mysql关联查询格式冲突问题[五月04]>,作者: KevinQ . 问题起源 作为CRUD程序员,最常 ...

  7. 我不就是吃点肉,应该没事吧——爬取一座城市里的烤肉店数据(附完整Python爬虫代码)

    写在前面的一点屁话: 对于肉食主义者,吃肉简直幸福感爆棚!特别是烤肉,看着一块块肉慢慢变熟,听着烤盘上"滋滋"的声响,这种期待感是任何其他食物都无法带来的.如果说甜点是" ...

  8. k8s之有状态服务部署基石(基础知识)

    PV&PVC&HeadlessService 4.1.什么是无状态/有状态服务? 无状态服务: 1.没有实时的数据需要存储 (即使有,也是静态数据) 2.服务集群网络中,拿掉一个服务后 ...

  9. java导出excel单sheet超过65535数据报错拆分多sheet导出

    在开发过程中,数据导出excel的功能很常见,数据少,到没问题,一旦超过65535条数据就会报错,因此可以考虑导出多个sheet来解决,代码如下: private static void export ...

  10. Jenkins安装推荐插件前,更换插件源

    网上找了很多都解决不了问题,直到看到jenkins-update-center,还有一个问题,就是尽量在实体机上装,感觉docker坑太多.... 安装jenkins,以Debian系为例 安装包在这 ...