CCPC-Wannafly Winter Camp Day1 爬爬爬山 (最短路)
题目描述
爬山是wlswls最喜欢的活动之一。
在一个神奇的世界里,一共有nn座山,mm条路。
wlswls初始有kk点体力,在爬山的过程中,他所处的海拔每上升1m1m,体力会减11点,海拔每下降1m1m,体力会加一点。
现在wlswls想从11号山走到nn号山,在这个过程中,他的体力不能低于00,所以他可以事先花费一些费用请dlsdls把某些山降低,将一座山降低ll米需要花费l*ll∗l的代价,且每座山的高度只能降低一次。因为wlswls现在就在11号山上,所以这座山的高度不可降低。
wlswls从11号山到nn号山的总代价为降低山的高度的总代价加上他走过的路的总长度。
wlswls想知道最小的代价是多少。
输入描述
第一行三个整数nn,mm,kk。
接下来一行nn个整数,第ii个整数h_ihi表示第ii座山的高度。
接下来mm行,每行三个整数xx,yy,zz表示xyxy之间有一条长度为zz的双向道路。
经过每条路时海拔是一个逐步上升或下降的过程。
数据保证11号山和nn号山联通。
1 \leq n, k, h_i, z \leq 1000001≤n,k,hi,z≤100000
1 \leq m \leq 2000001≤m≤200000
1 \leq x, y \leq n1≤x,y≤n
x \neq yx=y
输出描述
一行一个整数表示答案。
样例输入 1
4 5 1
1 2 3 4
1 2 1
1 3 1
1 4 100
2 4 1
3 4 1
样例输出 1
6 题意:
定义两个山i,j之间的消耗dist(i,j) 我们通过题意应该知道,dist不仅仅与题中给距离有关,
还与山i和j的高度差 h 有关,如果h大于k,那么需要多消耗 (h-k)*(h-k) 。
我们依据上述的距离关系来跑最短路算法,即可得到我们想要的答案。
细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = ; while (b) {if (b % )ans = ans * a % MOD; a = a * a % MOD; b /= ;} return ans;}
inline void getInt(int* p);
const int maxn = ;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/ int n, m;
ll k;
struct node
{
int to;
ll dist;
int next;
node() {}
node(int tt, ll dd)
{
to = tt;
dist = dd;
}
bool operator < (const node x)const {
return dist > x.dist;
}
};
priority_queue<node> heap;
int tot;
node edge[maxn];
int head[maxn];
void addedge(int u, int v, int dist)
{
edge[tot].dist = dist;
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
void init()
{
tot = ;
memset(head, -, sizeof(head));
}
ll h[maxn];
ll dis[maxn];
void dijkstra(int start)
{
// memset(dis,inf,sizeof(dis));
repd(i, , n)
{
dis[i] = 1e18;
}
dis[start] = ;
heap.push(node(start, 0ll));
node temp;
while (!heap.empty())
{
temp = heap.top();
heap.pop();
for (int i = head[temp.to]; i != -; i = edge[i].next)
{
int v = edge[i].to;
if (h[v] > k)
{
if (dis[v] > temp.dist + edge[i].dist + (h[v] - k) * (h[v] - k))
{
dis[v] = temp.dist + edge[i].dist + (h[v] - k) * (h[v] - k);
heap.push(node(edge[i].to, dis[v]));
}
} else
{
if (dis[v] > temp.dist + edge[i].dist)
{
dis[v] = temp.dist + edge[i].dist;
heap.push(node(edge[i].to, dis[v]));
}
}
}
}
}
int main()
{
//freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout); gbtb;
cin >> n >> m >> k;
repd(i, , n)
{
cin >> h[i];
}
repd(i, , n)
{
h[i] -= h[]; // 减去初始的高度方便后面处理
}
init(); // 初始化链式前向星
int u, v, d;
repd(i, , m)
{
cin >> u >> v >> d;
addedge(u, v, d); // 加边
addedge(v, u, d);
}
dijkstra();// 跑最短路
cout << dis[n] << endl; // 输出答案 return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
CCPC-Wannafly Winter Camp Day1 爬爬爬山 (最短路)的更多相关文章
- 2020 CCPC Wannafly Winter Camp Day1 C. 染色图
2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...
- 2020 CCPC Wannafly Winter Camp Day1 Div.1& F
#include<bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) #define fore(i, ...
- 2020 CCPC Wannafly Winter Camp Day1 - I. K小数查询(分块)
题目链接:K小数查询 题意:给你一个长度为$n$序列$A$,有$m$个操作,操作分为两种: 输入$x,y,c$,表示对$i\in[x,y] $,令$A_{i}=min(A_{i},c)$ 输入$x,y ...
- CCPC Wannafly Winter Camp Div2 部分题解
Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...
- 2020 CCPC Wannafly Winter Camp Day2-K-破忒头的匿名信
题目传送门 sol:先通过AC自动机构建字典,用$dp[i]$表示长串前$i$位的最小代价,若有一个单词$s$是长串的前$i$项的后缀,那么可以用$dp[i - len(s)] + val(s)$转移 ...
- 2020 CCPC Wannafly Winter Camp Day1-F-乘法
题目传送门 sol:二分答案$K$,算大于$K$的乘积有多少个.关键在于怎么算这个个数,官方题解上给出的复杂度是$O(nlogn)$,那么计算个数的复杂度是$O(n)$的.感觉写着有点困难,自己写了一 ...
- 2019 wannafly winter camp
2019 wannafly winter camp Name Rank Solved A B C D E F G H I J K day1 9 5/11 O O O O O day2 5 3/11 O ...
- 2019 wannafly winter camp day 3
2019 wannafly winter camp day 3 J 操作S等价于将S串取反,然后依次遍历取反后的串,每次加入新字符a,当前的串是T,那么这次操作之后的串就是TaT.这是第一次转化. 涉 ...
- 2019 wannafly winter camp day1-4代码库
目录 day1 F div1 爬爬爬山 (最短路) B div2 吃豆豆 (dp) J div2 夺宝奇兵(暴力) J div1 夺宝奇兵 (权值线段树) C div1 拆拆拆数 E div1 流流流 ...
随机推荐
- JS 替换所有的空格
在JS中替换掉输入框内的空格,是在处理表单需求的时候极为常用的一项操作,以防止用户的操作习惯引起数据异常,保证传参的安全性. NO.1 name.replace(" "," ...
- 旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)
题目地址 : 旋转数组. 网上好多不是根本就是错的,就是空间复杂度不是真正为1 下面总结一下 方法1 普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验) ··· publ ...
- 记录一下WPF中自寄宿asp.net服务添加urlacl的问题
asp.net公开服务地址时,由于当前用户权限问题,会导致服务地址未添加到urlacl池中报错. 关于添加urlacl的细节,请参考我之前的文章:asp.net self host and urlac ...
- 阶段3 1.Mybatis_09.Mybatis的多表操作_1 mybatis表之间关系分析
4.mybatis中的多表查询 表之间的关系有几种: 一对多 多对一 一对一 多对多 举例: 用户和订单 ...
- 【js】什么是函数节流与函数去抖
函数节流 意思:节省流量,不会一直访问. | 指定时间内不执行,指定时间后执行. | 一段时间内只执行一次 场景: 比如控制游戏人物攻击,时间内就算按得很快,也只能砍一刀,过后才能砍第二刀. 搜索引擎 ...
- TCP的三次握手过程
TCP::传输控制协议(Transmission Control Protocol ) 是一种面相连接的.可靠的.基于字节流的 传输层通信协议. TCP是一种面相连接的协议.其显著的特点就是在 ...
- OpenCV在ARM-linux上的移植过程遇到的问题3---共享库中嵌套库居然带路径【未解决】
[Linux开发]OpenCV在ARM-linux上的移植过程遇到的问题3-共享库中嵌套库居然带路径[未解决] 标签(空格分隔): [Linux开发] 移植opencv到tq2440 一.下载open ...
- linux最强编辑神器vim常用命令大全:编辑、插入、删除、替换、保存...
我说vim是编辑器之神大家没有意见吧 下面分享一些vim常用命令,大家可以收藏一下 进入vim: vim配置: vim中光标移动: vim中屏幕滚动: vim中插入文本类: 文本替换: 格式 : 范 ...
- vue点击除了某组件本身的其它地方, 隐藏该组件的方法
点击emoji表情标签, 出现标签组件,点击其它地方, 改组件消失的效果; <template> <div class="writeZoon"> <d ...
- P5016龙虎斗
这道题是2018年普及组的第二题,是一个模拟题. 首先计算出双方各自的势力,然后将增援的队伍势力加上,比较此时双方势力,并且作差,最后枚举将公平兵加在哪一个兵营.看似简单的题被我20分钟就写完了,但是 ...