「JOI 2014 Final」飞天鼠
「JOI 2014 Final」飞天鼠
显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0。
到达一个点有两种情况:到达高度为0和不为0。
对于高度不为0的情况,显然花费的时间越少高度越高(每下降1m都要1单位时间),而必然高度越高越好,因此只需求花费的最少时间。
对于高度为0的情况,显然花费的时间越少越好。
高度不为0的情况比高度为0的情况要优越,而且事实上,高度不为0的情况花费必然会小于高度为0的情况。因此两种情况可以直接合并。
故可以直接dijkstra跑一遍。
复杂度\(o(mlog(m))\)。
#include<bits/stdc++.h>
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)
#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)
#define mem(a,b) memset(a,b,sizeof a )
using namespace std;
typedef long long ll;
char buf[15000000],*p1=buf,*p2=buf;
#define Getchar() p1==p2?EOF:*p1++
void in(int &r) {
static char c;
r=0;
while(c=Getchar(),c<48);
do r=(r<<1)+(r<<3)+(c^48);
while(c=Getchar(),c>47);
}
const int mn=100005;
const int mm=300005;
int head[mn],ne[mm<<1],to[mm<<1],cost[mm<<1],cnt1;
#define link_edge(a,b,c) to[++cnt1]=b,ne[cnt1]=head[a],head[a]=cnt1,cost[cnt1]=c
#define travel(x) for(int q(head[x]);q;q=ne[q])
int val[mn];
int n,m;
ll sum[mn];
int H[mn];
bool mark[mn];
struct node {
ll v;
int id;
bool operator <(const node &A)const {
return v>A.v;
}
};
priority_queue<node> qw;
void WA(int at) {
rep(q,1,n)sum[q]=1e18;
qw.push({0,1}),H[1]=at,sum[1]=0;
ll v;
while(!qw.empty()) {
node now=qw.top();
qw.pop();
if(mark[now.id])continue;
mark[now.id]=1;
int h=H[now.id];
travel(now.id) {
if(h-cost[q]>val[to[q]]) {
v=sum[now.id]+h-cost[q]-val[to[q]]+cost[q];
if(sum[to[q]]>v) {
sum[to[q]]=v;
H[to[q]]=val[to[q]];
qw.push({sum[to[q]],to[q]});
}
} else if(h-cost[q]<0) {
v=sum[now.id]+cost[q]-h+cost[q];
if(sum[to[q]]>v) {
sum[to[q]]=v;
H[to[q]]=0;
qw.push({sum[to[q]],to[q]});
}
} else {
if(sum[to[q]]>sum[now.id]+cost[q]) {
sum[to[q]]=sum[now.id]+cost[q];
H[to[q]]=h-cost[q];
qw.push({sum[to[q]],to[q]});
}
}
}
}
}
int main() {
p2=buf+fread(buf,1,15000000,stdin);
int at;
in(n),in(m),in(at);
rep(q,1,n)in(val[q]);
int a,b,c;
rep(q,1,m) {
in(a),in(b),in(c);
if(val[a]>=c)link_edge(a,b,c);
if(val[b]>=c)link_edge(b,a,c);
}
WA(at);
if(sum[n]==1e18)puts("-1");
else printf("%lld\n",sum[n]+val[n]-H[n]);
return 0;
}
「JOI 2014 Final」飞天鼠的更多相关文章
- 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)
[题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...
- loj 2759「JOI 2014 Final」飞天鼠
loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...
- 【2018.10.1】「JOI 2014 Final」年轮蛋糕
题面 一看到求“最小值的最大值”这种问题,就能想到二分了. 二分答案,然后我们要把一圈分成三块,使这三块的大小都$\geq mid$.做法是把环展开成2倍长度的链,先钦定一个起点,然后根据前缀和再二分 ...
- 「JOI 2014 Final」裁剪线
做法一 首先将边界也视作四条裁剪线,整个平面作为一张纸,视存在 \(y = -\infty, y = +\infty, x = -\infty, x = +\infty\) 四条直线. 按照纵坐标依次 ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- 「JOI 2015 Final」城墙
「JOI 2015 Final」城墙 复杂度默认\(m=n\) 暴力 对于点\((i,j)\),记录\(ld[i][j]=min(向下延伸的长度,向右延伸的长度)\),\(rd[i][j]=min(向 ...
- 「JOI 2015 Final」舞会
「JOI 2015 Final」舞会 略微思考一下即可知该过程可以化为一棵树.(3个贵族中选择1个,即新建一个节点连向这3个贵族). 该树的结点个数为\(2n\). 考虑二分答案mid. 判定的是公主 ...
随机推荐
- Codeforces 450E:Jzzhu and Apples(构造,数学)
E. Jzzhu and Apples time limit per test: 1 seconds memory limit per test: 256 megabytes input: stand ...
- Codeforces 888E:Maximum Subsequence(枚举,二分)
You are given an array a consisting of n integers, and additionally an integer m. You have to choose ...
- 理解Android的四种启动模式
一:前言 四种模式分别为standard, singleTop, singleTask, singleInstance.自己应该明确一个概念先,single到底要single什么.每一个应用app都有 ...
- css--深入理解z-index引发的层叠上下文、层叠等级和层叠顺序
前言 在编写css样式代码的时候,我们经常会遇到z-index属性的使用,我们可能只了解z-index能够提高元素的层级,并不知道具体是怎么实现的.本文就来总结一个由z-index 引发的层叠上下文和 ...
- 「算法笔记」2-SAT 问题
一.定义 k-SAT(Satisfiability)问题的形式如下: 有 \(n\) 个 01 变量 \(x_1,x_2,\cdots,x_n\),另有 \(m\) 个变量取值需要满足的限制. 每个限 ...
- C++ switch 语句的用法
C++ 判断 一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. C++ 中 switch 语句的语法: ...
- Understanding and Improving Fast Adversarial Training
目录 概 主要内容 Random Step的作用 线性性质 gradient alignment 代码 Andriushchenko M. and Flammarion N. Understandin ...
- Java程序设计基础笔记 • 【第9章 方法与参数类型】
全部章节 >>>> 本章目录 9.1 有参数有返回值的方法 9.1.1 有参数有返回值的方法的定义和调用 9.1.2 返回值的传递过程 9.1.3 方法返回值的注意事项 9 ...
- Java面向对象笔记 • 【第6章 Java常用类】
全部章节 >>>> 本章目录 6.1 Object类 6.1.1 Object类概述 6.1.2 Object的常用方法 6.1.3 实践练习 6.2 String类和St ...
- 初识python: 继承
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"派生类". 被继承的类称为"基 ...