[JOI 2017 Final] 足球 (建图,最短路)
题面
题解
我们可以总结出球的两种状态,要么自己飞,要么在球员脚下被带飞。
自己飞的情况下,他只能单向直线运动,每一步代价为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] 足球 (建图,最短路)的更多相关文章
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...
- uva10067 Playing with Wheels 【建图+最短路】
题目:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1008">uva10067 Play ...
- 【建图+最短路】Bzoj1001 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- CodeForces 786B Legacy(线段树优化建图+最短路)
[题目链接] http://codeforces.com/problemset/problem/786/B [题目大意] 给出一些星球,现在有一些传送枪,可以从一个星球到另一个星球, 从一个星球到另一 ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- G. 神圣的 F2 连接着我们 线段树优化建图+最短路
这个题目和之前写的一个线段树优化建图是一样的. B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路 之前这个题目可以相当于一个模板,直接套用就可以了. 不 ...
- 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)
Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...
- BZOJ 4289: PA2012 Tax 差分建图 最短路
https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html ...
随机推荐
- 【lora无线数传通信模块】亿佰特E22串口模块用于物联网地震预警传感通信方案
物联网地震预警项目介绍: 地震,俗称地动.它像平常的刮风下雨一样,是一种常见的自然现象,是地壳运动的一种表现,即地球内部缓慢积累的能量突然释放而引起的地球表层的振动.据统计,5级以上地震就能够造成破坏 ...
- 开发工具-PowerShell下载地址
更新日志 2022年6月10日 初始化链接. https://github.com/PowerShell/PowerShell/releases/
- React关于constructor与super(props)之间的相爱相杀
我们先把菜鸟教程的一段代码拿过来分析一下.下面这段代码是用了将生命周期方法添加到类中实现时钟效果. // 将生命周期方法添加到类中 class Clock extends React.Componen ...
- Vue.js与ElementUI搭建无限级联层级表格组件
前言 今天,回老家了.第一件事就是回家把大屏安排上,写作的感觉太爽了,终于可以专心地写文章了.我们今天要做的项目是怎么样搭建一个无限级联层级表格组件,好了,多了不多说,赶快行动起来吧!项目一览 到底是 ...
- 使用dockerfile部署springboot应用
本章简单展示如何最短时间 把springboot应用打包成镜像并创建成容器. 准备工作: 1.安装docker ,保证执行docker version没有问题 2.拉下来一个jdk镜像 docker ...
- Pisa-Proxy 之 SQL 解析实践
SQL 语句解析是一个重要且复杂的技术,数据库流量相关的 SQL 审计.读写分离.分片等功能都依赖于 SQL 解析,而 Pisa-Proxy 作为 Database Mesh 理念的一个实践,对数据库 ...
- C#中将字符串转换成数值
Convert.ToInt32("999");
- Java TIF、JPG、PNG等图片转换
代码如下: public static void main(String[] args) { try { BufferedImage bufferegImage = ImageIO.read(new ...
- VScode运行总是显示running状态
一.每次点击运行都显示code is already running,而且键盘也没有办法输入 二.解决办法 注意:记得重新启动VScode
- 扩展新的WCV到标准的WC后,不能在业务角色里面看见视图解决方法
by zyi 感谢群主红枣的分享 1.把你的WCVIEW扩展进WC中 2.使用UI Designer打开你的WCVIEW 3.更改你的WCVIEW名字