题目

フクロモモンガの JOI 君が住んでいる森にはユーカリの木が N 本生えており,それらの木には 1 から N
の番号がついている.木 i の高さは Hi メートルである.
JOI 君が相互に直接飛び移ることのできる木の組が M 組あり,各組の木の間を飛び移るためにかかる時
間が定まっている.JOI 君が木の間を飛び移っている間は,地面からの高さが 1 秒あたり 1 メートル下が
る.すなわち,JOI 君の現在の地面からの高さが h メートル,木の間を飛び移るためにかかる時間が t 秒で
あるとき,飛び移った後の地面からの高さは h − t メートルとなる.ただし,h − t が 0 よりも小さくなる場
合や行き先の木の高さよりも大きくなる場合は飛び移ることができない.
さらに,JOI 君は木の側面を上下に移動することによって,地面からの高さを 0 メートルから今いる木
の高さの範囲で増減させることができる.JOI 君が地面からの高さを 1 メートル増加または減少させるた
めには 1 秒の時間がかかる.
JOI 君は,木 1 の高さ X メートルの位置から木 N の頂上 (高さ HN メートルの位置) に行こうとしており,
そのためにかかる時間の最小値を知りたい.

翻译过来就是:点之间的转移类似于滑翔,从\(x->y\)为\(h[x]-t\),如果\(0<=h[x]-t<=h[y]\)才是合法的,问从1的\(X\)处转移到\(n\)点的顶端要多久。

思路

一开始有一个初步思路就是将状态定义为当前在哪个点,以及高度是多少,再用map离散,set判重,优先队列跑Dijkstra。本地开$O(2)$1.5s+,不开3s+,交上去果断TLE50分。

这是代码~~

#include<bits/stdc++.h>
#define M 100005
#define LL long long
//#pragma GCC optimize(3)
using namespace std;
int n,m,X,h[M],tot,A[M];
struct edge{int nxt,to,co;
}G[M*6];
void Add(int a,int b,int c){G[++tot]=(edge){h[a],b,c};h[a]=tot;
}
struct node{LL co;int x,h;bool operator < (const node& res)const{return co>res.co;}bool operator == (const node& res)const{return (co==res.co);}
};
struct hs{int x,h;bool operator < (const hs& res) const{if(x!=res.x)return x<res.x;return h<res.h;}
};
bool vis[M];
priority_queue<node>Q;
map<hs,LL>mp;
set<hs>S;
node dis(int x,int h,int y,int t){node tmp;if(h-t>A[y]){tmp.co=h-A[y];tmp.h=A[y];}else if(h-t<0){tmp.co=t+t-h;tmp.h=0;if(t>A[x])tmp.co=-1;  }else {tmp.co=t;tmp.h=h-t;  }return tmp;
}
LL Dij(){LL ans=1e18;mp.clear();S.clear();mp[(hs){1,X}]=0;Q.push((node){0,1,X});while(!Q.empty()){node e=Q.top();Q.pop();if(e.x==n)ans=min(ans,e.co+abs(A[n]-e.h));if(S.find((hs){e.x,e.h})!=S.end())continue;S.insert((hs){e.x,e.h});for(int i=h[e.x];i;i=G[i].nxt){int u=G[i].to,v=G[i].co;node ds=dis(e.x,e.h,u,v);if(ds.co==-1)continue;if(mp.find((hs){u,ds.h})==mp.end()||mp[(hs){u,ds.h}]>e.co+ds.co){mp[(hs){u,ds.h}]=e.co+ds.co;Q.push((node){e.co+ds.co,u,ds.h});}}}if(ans==1e18)return -1;return ans;
}
int main(){
//  freopen("data.in","r",stdin);cin>>n>>m>>X;for(int i=1;i<=n;i++)scanf("%d",&A[i]);for(int i=1,a,b,c;i<=m;i++){scanf("%d%d%d",&a,&b,&c);Add(a,b,c);Add(b,a,c);}printf("%lld\n",Dij());return 0;
}

然后理了一下思路发现不可能这么复杂。然后就知道,对于一个点来说,靠滑翔向下走和向上走都是没有关系的

最后直接+\(abs(X-dis[n]-A[n])\)j就行了,只有向下走比较棘手。

然后再考虑一下Dijkstra的原理,每个点是逐层扩展的,那么我们将约束条件加上不就行了吗?

因为一个点到1点经过的距离一定\(>=X-A[u]\),如果不是这样的话,就说明有一些向下走的操作被忽略了。直接将这个dis值赋为\(X-A[u]\)就行了,这是一定能取到的,因为Dijkstra算法的原理决定了这一点。

代码

#include<bits/stdc++.h>
#define M 100005
#define LL long long
#define clr(x,y) memset(x,y,sizeof(x))
using namespace std;
int n,m,X,h[M],tot,A[M];
struct edge{int nxt,to,co;
}G[M*6];
void Add(int a,int b,int c){G[++tot]=(edge){h[a],b,c};h[a]=tot;
}
struct node{LL co,x;bool operator < (const node& res)const{return co>res.co;}
};
bool vis[M];
LL dis[M];
priority_queue<node>Q;
LL Dij(){LL ans=1e18;Q.push((node){0,1});clr(dis,63);dis[1]=0;while(!Q.empty()){node e=Q.top();Q.pop();if(vis[e.x])continue;vis[e.x]=1;for(int i=h[e.x];i;i=G[i].nxt){int u=G[i].to;LL v=G[i].co;if(A[e.x]<v)continue;v=dis[e.x]+v;if(X>A[u])v=max(v,1LL*(X-A[u]));if(dis[u]>v){dis[u]=v;Q.push((node){dis[u],u});}}}if(dis[n]>1e18)return -1;return dis[n]+abs(X-dis[n]-A[n]);
}
int main(){
//  freopen("data.in","r",stdin);cin>>n>>m>>X;for(int i=1;i<=n;i++)scanf("%d",&A[i]);for(int i=1,a,b,c;i<=m;i++){scanf("%d%d%d",&a,&b,&c);Add(a,b,c);Add(b,a,c);}printf("%lld\n",Dij());return 0;
}

转载于:https://www.cnblogs.com/zryabc/p/10389511.html

JOI2014Final 飞天鼠相关推荐

  1. wps单机无网络版_单平台销量破百万,这个国产单机系列要出网游,还要上主机...

    他们想做"国际顶级的单机游戏开发商". 文/彭子诚 作为一款国产单机游戏,<古剑奇谭三>在去年年底上市后,至今在 Steam 上依然保持着 83% 的好评率. 大量的玩 ...

  2. 韩国票房:“蜘蛛侠”挤掉“美队”称王

    <超凡蜘蛛侠2>韩国登顶挤掉<美队2> <美国队长2>名次下滑 不敌<蜘蛛侠2> <天才眼镜狗>上映 票房一般 新浪娱乐讯 本周韩国电影市场 ...

  3. 2008最新鼠年春节拜年短信大全

    祝你鼠年身体健康得像硕鼠,聪明灵俐得像鼹鼠,活泼可爱得像松鼠,挣钱挣得像袋鼠,收获多多像田鼠,看奥运兴奋得像飞鼠,天天快乐得像米老鼠! 新年到,"鼠"来宝,鼠年鼠愿表一表,愿您烦恼 ...

  4. 第十八届全国大学智能汽车竞赛报名信息统计

    01 报名信息 一.前言   截止到 2023年6月15日, 第十八届全国大学生智能车竞赛 竞速比赛 报名阶段接近尾声. 参赛赛队伍在 竞赛网站 按照 竞赛网络报名方法 进行了注册, 并提交了队伍参赛 ...

  5. 第十八届全国大学智能汽车竞赛报名信息统计:华北赛区报名队伍

    承办学校: 太原工业学院 比赛时间: 7月17日-19日 第十八届全国大学智能汽车竞赛报名信息统计 01 报名队伍 序号 组别 学校 队伍名称 学生1 学生2 学生3 学生4 学生5 教师1 教师2 ...

  6. 第十八届全国大学生智能车竞赛华北赛区成绩与奖项

    简 介: 本文汇总了第十八届全国大学智能汽车华北赛区比赛成绩和奖项, 正式公布文档将会在 全国大学生智能车竞赛网站 进行公布. 关键词: 智能车竞赛,华北赛区,第十八届,成绩,奖项 #mermaid- ...

  7. 2.4g 无线键鼠对码软件_富德iK8900无线键鼠套装评测:静音纤薄

    作为世界三大无线键鼠品牌之一的富德科技,自2008年成立以来就专注于无线键鼠领域.凭借扎实的品质.出色的做工以及时尚潮流的外观设计,获得了众多年轻消费者的青睐.更与时下较为流行的动漫IP合作,推出联名 ...

  8. 忍不住要发感慨,我的这个罗技鼠真好用...

    终于忍不住了,把台式机上的罗技鼠换到了本本上,我这个当初花了100元买的罗技鼠真的是好用,至少对我而言如是.总感觉我的那个极动鲨有些厚重,虽然他也一样好用,但同这个罗技鼠相比,却多了分厚重,少了些灵动 ...

  9. 从飞天到倚天 阿里云底层自研技术大爆发

    10月20日,2021云栖大会上,阿里云发布了倚天.磐久.神龙4.0.龙蜥.灵杰等多款重磅产品,阿里云"做深基础"成果浮出水面,底层自研技术迎来大爆发. 阿里云智能总裁张建锋表示, ...

  10. 飞天AI平台到底哪里与众不同?听听它的架构者怎么说

    采访嘉宾 | 林伟 整理 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 天下没有不散的宴席. 9 月 25 日,云栖大会在云栖小镇开始,历经三天的技术盛宴,于 9 月 27 日的傍晚 ...

最新文章

  1. Linux Kernel TCP/IP Stack — L1 Layer — 多队列网卡
  2. openocd调试Linux内核,Ubuntu下配置OpenOCD+FT2232
  3. Beyond Compare进行内容替换的方法有哪些
  4. linux中 ln -s 软链接
  5. 为什么torch.nn.Linear的表达形式为y=xA^T+b而不是常见的y=Ax+b?
  6. ios刷android8.0,颤抖吧 iOS, Android 8.0正式发布!
  7. 02 - 替换SetInput方法 VTK 6.0 迁移 (2013-06-30 16:22)
  8. 32位ubuntu 使用pae
  9. mysql 查询的关键词的执行顺序
  10. java基础总结06-常用api类-包装类
  11. 基于Go Packet实现网络数据包的捕获与分析
  12. 盗心贼歌曲用计算机多少数字,盗心贼简谱(歌词)-黑龙演唱-桃李醉春风记谱
  13. ArcGIS操作系列(一)之地理配准
  14. 马化腾:谈谈我创办腾讯这些年
  15. 【Unity 3D】简易小车游戏
  16. 检查日期是否为节假日api
  17. codeforce 760 B Frodo and pillows 二分搜索
  18. 群晖 Docker加速方案
  19. 〖Python零基础入门篇㉟〗- 私有函数、私有变量及封装
  20. python你好怎么写_python学习之python入门

热门文章

  1. python局域网文件互传
  2. Ubuntu跳过开机自检
  3. 海康威视摄像头安装与配置
  4. 两个向量叉乘表示什么意思_为什么两个空间向量的向量积的摸等于以这两个 – 手机爱问...
  5. 文件管理系统:5款优秀的文档管理系统
  6. IDEA设置为Eclipse常用快捷键keymap
  7. debian docker_如何在Debian 10上安装和使用Docker
  8. 解决微信屏蔽淘宝链接的方法
  9. SiamRPN++算法详解
  10. 强化学习从K-摇臂老虎机开始