最短路

和正解的做法不一样,不过都是 O((q+n)logm)O((q+n) logm )的。

我的做法:也是最短路。把巴士看成点,并拆成入点和出点,边权为y-x(走它的意义是坐了这个巴士)。对于每一个原图的点u,把所有从这里出去的巴士按x排序,x小的前一辆i-1的入点向后一辆i的入点连边,边权x[i]-x[i-1](走它的意义是去考虑坐i号巴士并消耗等车时间)。把每一辆进入u的巴士的出点连向所有离开u的巴士中x恰好大于它的y的巴士的入点,边权为出去的那辆巴士的y-进入的那辆巴士的x(走它的意义是换车的等车时间)。跑最短路之后在s的出边二分即可。

正解(贴PO爷原文,戳我查看原文):将二元组<站点,时间>看做一个点,那么点数是O(m)的 ,每辆巴士连一条边,每个点向下一个时间连边,然后将所有边反向 ,枚举终点站的每一个时间,加入队列广搜,得到最晚多久到达1号站点可以在这个时间到达终点站,然后对于每个询问去数组中二分即可

好气啊,不知道怎么的刚开始偏大数据拍WA了,后来代码没改重新拍又拍不WA了,交上去居然A了。。。呵呵呵呵

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 600005
using namespace std;
namespace runzhe2000
{int read(){int r = 0; char c = getchar();for(; c < '0' || c > '9'; c = getchar());for(; c >='0' && c <='9'; c = getchar()) r=r*10+c-'0';return r;}const int INF = 1<<28;int n, m, last[N], ecnt, dis[N], T;bool vis[N];vector<int> in[N], out[N];struct edge{int next, to, val;}e[N<<1];struct Bus{int a, b, x, y;}bus[N]; struct item{int x, dis;};bool operator < (item a, item b) {return a.dis > b.dis;}bool cmp(int i1, int i2){return bus[i1].x < bus[i2].x;}void addedge(int a, int b, int c){e[++ecnt] = (edge){last[a], b, c}; last[a] = ecnt;}int pack(int i, int j){return i*2+j;}void dijkstra(){memset(dis, 63, sizeof(dis));priority_queue<item> q;q.push((item){T, dis[T] = 0});for(; !q.empty(); ){int x = q.top().x; q.pop();if(vis[x])continue; vis[x] = 1;for(int i = last[x]; i; i = e[i].next){int y = e[i].to;if(dis[x] + e[i].val <  dis[y]) q.push((item){y, dis[y] = dis[x] + e[i].val});}}}void main(){n = read(), m = read();for(int i = 1; i <= m; i++){bus[i].a = read(), bus[i].b = read(), bus[i].x = read(), bus[i].y = read();out[bus[i].a].push_back(i);in[bus[i].b].push_back(i);addedge(pack(i, 1), pack(i, 0), bus[i].y - bus[i].x);}for(int i = 1; i <= n; i++)out[i].push_back(0);bus[0].x = INF, bus[0].y = INF+INF;for(int i = 1; i < n; i++){sort(out[i].begin(), out[i].end(), cmp);for(int j = 0; j < (int)in[i].size(); j++){int u = in[i][j], l = 0, r = (int)out[i].size()-1;for(; l < r; ){int mid = (l+r)>>1;if(bus[out[i][mid]].x >= bus[u].y) r = mid;else l = mid+1;}addedge(pack(out[i][l], 0), pack(u, 1), bus[out[i][l]].x - bus[u].y);}for(int j = 1; j < (int)out[i].size(); j++) addedge(pack(out[i][j], 0), pack(out[i][j-1], 0), bus[out[i][j]].x - bus[out[i][j-1]].x);}T = pack(m+1,0);for(int i = 0; i < (int)in[n].size(); i++)addedge(T, pack(in[n][i], 1), 0);dijkstra();for(int i = 0; i < (int)out[1].size(); i++)dis[pack(out[1][i], 0)] += bus[out[1][i]].x;for(int Q =read(), t; Q--; ){t = read();int l = 0, r = out[1].size() - 1;for(; l < r; ){int mid = (l+r+1)>>1;if(dis[pack(out[1][mid], 0)] <= t) l = mid;else r = mid - 1;}if(dis[pack(out[1][l], 0)] <= t) printf("%d\n",bus[out[1][l]].x);else puts("-1");}}
}
int main()
{runzhe2000::main();
}

BZOJ 4239 巴士走读相关推荐

  1. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 题解部分: (如果不怎么喜欢看推导的人可以直接看下面的关键部分,在段尾会有标注(或者看完定义直接看代码)) 本题让我们求到达点n需要最晚何时到达点1,我们可 ...

  2. git ssh配置文件 服务器_Linux 环境 搭建Git 服务器,并且修改SSH端口使用

    1.环境配置说明 服务器 CentOS 7 + git(git version 1.8.3.1) 客户端 Windows10 + SourceTree 2.安装 Git 服务器端安装: sudo yu ...

  3. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  4. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  5. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  6. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  7. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  8. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  9. Apache Spark源码走读之8 -- Spark on Yarn

    欢迎转载,转载请注明出处,徽沪一郎. 概要 Hadoop2中的Yarn是一个分布式计算资源的管理平台,由于其有极好的模型抽象,非常有可能成为分布式计算资源管理的事实标准.其主要职责将是分布式计算集群的 ...

最新文章

  1. 驼峰命名法模态对话框
  2. Linux编程——入门级Makefile文件编写
  3. 汇编语言程序如何转化成c语言,如何把汇编语言转换成C语言
  4. 「后端小伙伴来学前端了」Element修改默认样式 | 记录自己学习前端踩坑日记
  5. visual studio 调试python_Visual Studio Code Python 调试设置
  6. 升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...
  7. 对于不是特别擅长Photoshop的人来说,熟悉和运用Photoshop工具提供的各类便捷的快捷键,是有帮助的。...
  8. 基于Kubernetes的Spark部署完全指南
  9. Linux平台下卸载ORACLE
  10. JAVA怎么在函数内改变传入的值
  11. slice,substr,substring三者的区别
  12. php两个数组删除相同数据,php – 如何从两个数组中删除重复对?
  13. uniapp 小程序生成二维码 (兼容H5、微信小程序)
  14. 日本铁路“猫站长”走红
  15. hx711基本原理讲解
  16. 注册Gmail账号手机号码提示无法验证
  17. iframe 嵌入html页面,iframe 完美嵌入网页
  18. 金蝶生成凭证模板_金蝶凭证导入模板
  19. 如何让图片放大不模糊?
  20. 最简单的线性回归模型 李烨_模型

热门文章

  1. matlab怎么调用filter函数,如何在matlab中建立和调用filter函数
  2. LDAP认证服务客户端配置
  3. vue之原生上传图片并压缩图片大小(1)
  4. IOS - rangeOfString、NSNotFound
  5. 《星露谷物语》mod安装超详细教程
  6. 百度easydl数据标注
  7. 软件测试基础理论2-产品模型
  8. 模拟信号、数字信号,信号是如何被处理的?
  9. [Python报错]CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired
  10. 计算方法 7.数值积分计算方法