Description

太空中一共有n座星球,它们之间可以通过空间传送装置进行转移。空间传送装置分为m种,第i种装置可以用4个参
数a_i,b_i,c_i,d_i来描述。因为时空抖动的问题,在非整数时刻禁止使用空间传送装置。如果在整数s时刻使用装
置,那么需要花费((a_i*s+b_i) mod c_i)+d_i单位时间才能完成传送。现在是s时刻,小Q位于1号星球,请写一个
程序计算从1号星球到每个星球最少需要的时间。

Input

第一行包含4个正整数n,m,s,e(2<=n<=100000,1<=m<=50,1<=s<=2000,1<=e<=200000)
分别表示星球的个数、空间传送装置的种类数、当前的时间以及空间传送装置的个数。
接下来m行,每行4个正整数a_i,b_i,c_i,d_i(1<=a_i,b_i,c_i,d_i<=2000),依次描述每种装置的参数。
接下来e行,每行3个正整数u_i,v_i,w_i(1<=u_i,v_i<=n,u_i!=v_i,1<=w_i<=m)
表示从星球u_i可以使用第w_i种装置单向传送到星球v_i。

Output

输出n-1行,每行一个整数,第i行表示从1到i+1的最少所需时间,若无解输出-1。
O(mc)递推预处理出每种边在模c意义下x时刻的边长,然后做普通的最短路。
#include<bits/stdc++.h>
typedef unsigned int u32;
const int N=1e5+;
int _(){int x;scanf("%d",&x);return x;}
int n,m,e;
struct edge{
int to,tp;
edge*nx;
}es[N*],*ep=es,*e0[N];
struct node{
u32 w,l;
bool operator<(const node&w)const{return l>w.l;}
};
std::priority_queue<node>q;
u32 l[N];
void mins(u32&a,u32 b){if(a>b)a=b;}
struct etype{
u32 a,b,c,d,ds[];
void read(){
a=_(),b=_(),c=_(),d=_();
for(u32 i=;i<c;++i)ds[i]=(a*i+b)%c;
for(int t=;t<;++t){
ds[c]=ds[];
for(u32 i=c;i;--i)mins(ds[i-],ds[i]+);
}
for(u32 i=;i<c;++i)ds[i]+=d;
}
u32 operator()(u32 x){return ds[x%c];}
}ts[];
int main(){
n=_();m=_();l[]=_();e=_();
for(int i=;i<=m;++i)ts[i].read();
for(int i=,a,b,c;i<=e;++i){
a=_(),b=_(),c=_();
*ep=(edge){b,c,e0[a]};e0[a]=ep++;
}
for(int i=;i<=n;++i)l[i]=UINT_MAX;
q.push((node){,l[]});
while(q.size()){
node w=q.top();q.pop();
if(w.l!=l[w.w])continue;
for(edge*i=e0[w.w];i;i=i->nx){
u32 u=i->to,d=ts[i->tp](w.l);
if(l[u]>w.l+d)q.push((node){u,l[u]=w.l+d});
}
}
for(int i=;i<=n;++i)l[i]==UINT_MAX?puts("-1"):printf("%u\n",l[i]-l[]);
return ;
}

bzoj5047: 空间传送装置的更多相关文章

  1. BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5047 题意概括 概括??~别为难语文做一题错两题的我了…… 题解 我们发现,对于某一种装置,有c种 ...

  2. 【BZOJ5047】空间传送装置 最短路

    [BZOJ5047]空间传送装置 Description 太空中一共有n座星球,它们之间可以通过空间传送装置进行转移.空间传送装置分为m种,第i种装置可以用4个参数a_i,b_i,c_i,d_i来描述 ...

  3. 【bzoj5047】空间传送装置 堆优化Dijkstra

    题目描述 n个点e条边的有向图,每条边是m种类型之一.第i种类型在第x时刻通过所花费的时间为$(a_i*x+b_i)\mod c_i+d_i$.可以在某个点停留.问:在s时刻从1号点出发,到达每个点所 ...

  4. 【BZOJ 5047 空间传送装置】

    Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 282  Solved: 121[Submit][Status][Discuss] Descriptio ...

  5. bzoj5047 [Lydsy1709月赛]空间传送装置 最短路

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5047 题解 题目中没有说可以停留在一个点等待.问了别人才知道停留是可以的. 那么既然停留是可以 ...

  6. Linux 添加新磁盘,在线扩充空间

    CentOS 7开发环境中的home 目录空间满了,需要增加空间 到虚拟机上执行"ls /sys/class/scsi_host",然后重新扫描SCSI总线来添加设备.如右图.然后 ...

  7. QQ空间动态爬虫

    作者:虚静 链接:https://zhuanlan.zhihu.com/p/24656161 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 先说明几件事: 题目的意 ...

  8. android计算每个目录剩余空间丶总空间以及SD卡剩余空间

    ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...

  9. 查看mac中磁盘空间占用情况

    今天发现磁盘空间不够了,首先要找到那些文件夹占用了磁盘空间. du命令很好使 du -c -d 1 -m | sort -n -c 显示当前文件夹总计占用空间 -d 1 层级为1,即只显示当前目录下一 ...

随机推荐

  1. 关于antd 日期组件只选择年份,设置mode=year无法获取value的解决办法

    antd3.0后的某个版本后终于支持了只选择年份的设置.当时2.x版本的时候还不支持只选择年份,我们项目中有这个只选择年份的需求,为了ui风格的一致,只好自己撸了一个. 如今真是普天同庆!

  2. 基础模块 网络连接检查 js

    //无对象则加载 if (typeof Base == "undefined") Base = function() {} // 获取时间对象的基本方法 Base.prototyp ...

  3. html5(四) canvas

    http://www.cnblogs.com/Gyoung/archive/2013/04/08/2994515.html

  4. event对象的clientX,offsetX,screenX,pageX

    chrome: e.pageX——相对整个页面的坐标 e.layerX——相对当前坐标系的border左上角开始的坐标 e.offsetX——相对当前坐标系的border左上角开始的坐标 e.clie ...

  5. Python日期的加减等操作

    1. 日期输出格式化 所有日期.时间的api都在datetime模块内. 1. datetime => string now = datetime.datetime.now() now.strf ...

  6. unity中实现场景之间加载进度条

    using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using UnityEngine.UI ...

  7. nodejs 安装失败 ,出现error 2502 和error2503

    出现error 2502 和error2503是因为win8的权限问题所导致的,具体说就是要以管理员身份进行安装就可以解决,下面详细来说一下. 1.cmd命令行点击以管理员身份运行. 2.这时候就可以 ...

  8. JavaWeb基础-过滤器监听器

    过滤器 1定义:过滤器是一个服务器的组件,他可以截取用户端的请求与响应信息,并对这些信息进行过滤;过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 2过滤器的工作原理: 3过滤器 ...

  9. My First Linux Module

    My First Linux Module Today, I successfully build my first linux hello module. First of all add a di ...

  10. Python2入门(1)

    一.基础语法1 - 输出语句 print "hello world",print默认输出换行,如果需要实现不换行需在变量末尾加上逗号,; 2 - python合法标识符 3 - 字 ...