最短路

和正解的做法不一样,不过都是 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. SpringMVC 国际化
  3. php客户反馈发邮箱,PHP实现通过get方式识别用户发送邮件的方法
  4. ubuntu16.04安装OVS(Open vSwitch)
  5. 【EXLIBRIS】随笔记 006
  6. Wireshark数据分析IP
  7. python 创建目录_第二天:Python中目录及文件操作
  8. 我看objective-C --不要把objC当做c/c++的超集
  9. linux中的信号3——alarm、pause函数
  10. vfp : 顶层表单附加菜单
  11. 在im4java中使用GraphicsMagick
  12. Qt - QVariant
  13. rapidminer简介与安装
  14. 电脑软件单击打开切换为双击打开
  15. 外贸常用术语_常用外贸术语大全,外贸人的必备
  16. python中sep是什么意思_python sep啥意思
  17. Linux编译simplest_ffmpeg_player
  18. 博达路由器如何配置互联网ip_博达路由器操作命令
  19. 一台主机连接两台显示器单独分开工作
  20. stitching.cpp鱼眼图像拼接融合 源码分析

热门文章

  1. 遗忘曲线艾宾浩斯规律
  2. 纵断面 java_道路土方计算软件
  3. 【你好,windows】Win10 x64 1709 X64企业G纯净版2019.7.28
  4. Visio 2016 和 SharePoint Designer 2013 来创建工作流并将其发布到 SharePoint 2016 网站而无需任何代码
  5. Word插入题注优化(自动删除标签与编号前的空格,编号后添加空格)
  6. 修复树莓派鼠标移动缓慢迟滞问题
  7. 解决树莓派4B无线鼠标迟滞/延迟的问题
  8. 利用R语言irr包计算ICC值(组内相关系数)
  9. 基于Slim微型框架实现强大的API—— Slim入门篇
  10. 什么是浮动、为什么要清除浮动