「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. 判定的是公主 ...
随机推荐
- 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI
前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...
- @Transactional 失效
1.Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用. @Transactional void insertTestWrongModi ...
- Deep Linear Networks with Arbitrary Loss: All Local Minima Are Global
目录 问题 假设和重要结果 证明 注 Laurent T, Von Brecht J H. Deep linear networks with arbitrary loss: All local mi ...
- # 中文NER的那些事儿6. NER新范式!你问我答之MRC
就像Transformer带火了"XX is all you need"的论文起名大法,最近也看到了好多"Unified XX Framework for XX" ...
- Java初学者作业——编写JAVA程序,根据用户输入课程名称,输出对应课程的简介,各门课程的简介见表
返回本章节 返回作业目录 需求说明: 编写JAVA程序,根据用户输入课程名称,输出对应课程的简介,各门课程的简介见表 课程名称 课程简介 JAVA课程 JAVA语言是目前最流行的编写语言,在本课程中将 ...
- docker学习:dockefile解析
是什么 DockerFile 是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 构建三部曲 编写Dockerfile文件 docker build docker run 文件什么样 ...
- PHP 开启 Opcache 功能提升程序处理效率
简介 Opcache 的前生是 Optimizer+ ,它是 Zend 开发的 PHP 优化加速组件.Optimizer+ 将 PHP 代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反 ...
- Python3.7 发送邮件 报‘[WinError 10061] 由于目标计算机积极拒绝,无法连接’错误的解决方法
背景: 最近在练习Python 的邮件发送功能 照着教程写了一个简单的demo 结果运行时报如下错误:[WinError 10061] 由于目标计算机积极拒绝,无法连接. 如图: 解决路径如下: St ...
- Java 递归 常见24道题目 总结
1.N个台阶的走法递归[这里设为10个台阶] /** * N个台阶的走法递归 * <p> * 有个楼梯,台阶有10个,每次可以跳上1阶 或者 2阶 ,那么台阶的走法一共有多少种 */ @T ...
- spring boot热部署 -- 实现 后端java热更新 -- 详细操作 【idea 的 JRebel破解】
1.前言 上一随笔写了如何使得spring boot热更新前端 ,但后端java部分无法热更新. 对于Java热更新,以前常使用 springloaded ,但是缺点 和bug很多 无法实现真正意 ...