UOJ #588. 图图的旅行

news/2024/10/18 7:52:58/
【题目描述】:
图图计划去Bzeroth 的精灵王国去旅游,精灵王国由n 座城市组成,第i 座城市有3 个属性x[i],w[i],t[i]。在精灵王国的城市之间穿行只能依靠传送阵,第i 座城市的传送阵可以将图图从城市i 传送到距离城市i 不超过w[i]的任意一个城市,并需要t[i]的时间完成传送。现在图图知道了每个城市的坐标x[i],想知道他从城市s 到城市t 的最小时间。这么难的问题图图当然不会做了,他想让你帮帮他,你能解决这个问题吗?【输入描述】:
第一行包含3 个正整数n、s、t,表示城市个数,起点城市和终点城市。第二行包含n 个整数x[i],表示第i 座城市的坐标。第三行包含n 个整数w[i],表示第i 座城市的传送距离。第四行包含n 个整数t[i],表示第i 座城市的传送时间。【输出描述】:
请输出从城市s 到城市t 的最小时间,保证至少存在一组合法解。【样例输入】:
7 3 7
-1 0 1 2 3 5 10
11 0 1 1 4 10 2
3 1 1 1 2 4 5
【样例输出】:
7
【样例说明】:
路线为3 → 4 → 5 → 1 → 7,时间之和为7。【时间限制、数据范围及描述】:
时间:1s 空间:256M对于30%的数据,1≤n≤2501,所有的t[i]均相等。对于60%的数据,1≤n≤2501。对于100%的数据,1≤n≤152501,0≤w[i],t[i],|x[i]|≤10^9,保证x[i]严格递增。本题的关键是要看出每个点所能到达的点是一个区间,所以直接用线段树的思想来建边,每次只要将一个点连上它所对应的区间即可.
然后线段树内部就父亲连向儿子,这样点数虽增多了,但是边数却减少为nlogn,最后再跑一边dijkstra就行了.Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=1000005;
int n,cnt,head[N*4],X[N],D[N],T[N],wl[N],wr[N];
long long dis[N*4];
bool vis[N*4];
struct Node{int v,nxt,w;
}edge[N*8];
struct node{int u;long long d;
};
bool operator<(const node &p,const node &q){return p.d>q.d;
}
priority_queue<node> q;
void add(int u,int v,int w){cnt++;edge[cnt].v=v;edge[cnt].w=w;edge[cnt].nxt=head[u];head[u]=cnt;
}
void build(int o,int l,int r){if (l==r){add(o+n,l,0);return;}int mid=(l+r)>>1;build(o<<1,l,mid);build(o<<1|1,mid+1,r);add(o+n,(o<<1)+n,0);add(o+n,(o<<1|1)+n,0);
}
void update(int o,int l,int r,int u,int ql,int qr,int w){if (l>=ql && r<=qr){add(u,o+n,w);return;}int mid=(l+r)>>1;if (ql<=mid){update(o<<1,l,mid,u,ql,qr,w);}if (qr>=mid+1){update(o<<1|1,mid+1,r,u,ql,qr,w);}
}
void dijkstra(int s){for(int i=1;i<N*4;i++){dis[i]=1e18;}dis[s]=0;q.push((node){s,0});while (!q.empty()){int u=q.top().u;q.pop();if (vis[u]){continue;}vis[u]=1;for (int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;if (dis[v]>dis[u]+edge[i].w){dis[v]=dis[u]+edge[i].w;if (!vis[v]){q.push((node){v,dis[v]});}}}}
}
int main(){int s,t;scanf("%d%d%d",&n,&s,&t);for(int i=1;i<=n;i++){scanf("%d",&X[i]);}for(int i=1;i<=n;i++){scanf("%d",&D[i]);}for(int i=1;i<=n;i++){scanf("%d",&T[i]);}build(1,1,n);for (int i=1;i<=n;i++){wl[i]=lower_bound(X+1,X+1+n,X[i]-D[i])-X;wr[i]=upper_bound(X+1,X+1+n,X[i]+D[i])-X-1;}for (int i=1;i<=n;i++){update(1,1,n,i,wl[i],wr[i],T[i]);}dijkstra(s);printf("%lld\n",dis[t]);return 0;
}

转载于:https://www.cnblogs.com/ukcxrtjr/p/11556592.html


http://www.ppmy.cn/news/273999.html

相关文章

arcmap中图斑面积代表_使用Arcgis计算土地利用现状图图斑面积

使用 Arcgis 计算土地利用现状图图斑面积步骤 一、 CAD 图形处理 处理原则:所画地类界线与外围范围线能够围成闭合的区域,每个区域内均包 含一个地类符号或地类名称 将 .dwg 文件导入到 Arcgis 数据库中 三、地类界线拓扑成面 ② 打开 Catalog " “ , 新建面要素 在相应…

图图的学习计划3.23

LeetCode每日一题 题目&#xff1a;判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从…

#589. 图图的游戏

【题目描述】&#xff1a; 图图正在玩一个智力游戏&#xff1a;有一个nn 的01 方格&#xff0c;图图要从中选出一个面积最大的矩形区域&#xff0c;要求这个矩形区域不能有超过k个1。这么难的问题图图当然不会做了&#xff0c;他想让你帮帮他&#xff0c;你能解决这个问题吗&am…

✿ISCC2021✿糊图图

致敬沐沐子 题目地址 链接&#xff1a;https://pan.baidu.com/s/1NvLzi1mM7AHK67j1xR0mxw 提取码&#xff1a;7aea 这里就不说思路了直接上完整解题流程 flag.rar解压后的文件附加了NTFS流&#xff0c;用软件提取出来 下图里面是真正的密码&#xff0c;压缩包为弱密码&#xf…

宋图图的PHP课程02

day02 apache的安装配置 如何公开服务器下的文件 1.找到配置文件 htttd.cong 2.将deny from all 改为 allow from all 配置根路径 默认的网站的根路径是我们的www子目录 如果不想使用该目录 可以配置根路径 1.找到配置文件 D:\develop\amp\bin\apache\Apache2.4.4\conf http…

纯css制作大耳朵图图

跟着教程学了用纯css做了大白之后&#xff0c;自己做了一个大耳朵图图。 html部分&#xff1a; <div id"tutu"><div id"hair"><div id"hair1"></div><div id"hair2"></div><div id"hai…

Android连接手机真机调试。(小米为例,其他品牌类似)

自己也是一个在学习中的小白&#xff0c;在用真机调试安装软件的过程中发生很多问题&#xff0c;耽误了很多时间和精力&#xff0c;下面根据我自己操作的实际经验&#xff0c;总结一下我的操作方法。亲测有效&#xff0c;希望能帮到大家。 1、我假设你已经搞定了前面gradle和b…