首页 > 其他分享 >P4678 [BalticOI 2005] Bus Trip 题解

P4678 [BalticOI 2005] Bus Trip 题解

时间:2023-10-26 21:13:26浏览次数:33  
标签:dist idx int 题解 ans build 2005 Bus

P4678 [BalticOI 2005] Bus Trip 题解(RE:题解再改造!!)

贴码

#include<bits/stdc++.h>
#define MAXN 500010
using namespace std;
//ifstream is("trip.in",ios::in);
//ofstream os("trip.out",ios::out);
//#define cin is
//#define cout os
int n,m,p,t,tote,dist[MAXN],ans[MAXN];
struct Bus {
int x,t,idx,dist;
}b[MAXN];
void build(int x,int t,int idx,int dist){
b[++tote]={x,t,idx,dist};
}
bool cmp(const Bus &x,const Bus &y){
return x.t==y.t?x.dist>y.dist:x.t<y.t;
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m>>p>>t;
for(int i=1,s,t,a,b,c,d;i<=m;i++){
cin>>s>>t>>a>>b>>c>>d;
build(s,a,i,0);
build(t,d,i,c-b);
}
build(n+1,t,0,-0x3f3f3f3f);
sort(b+1,b+tote+1,cmp);
memset(dist,250,sizeof(dist));
dist[1]=0;
for(int i=1;i<=tote;i++){
if(b[i].x==n+1) break;
if(!b[i].dist) ans[b[i].idx]=dist[b[i].x];
else dist[b[i].x]=max(dist[b[i].x],ans[b[i].idx]+b[i].dist);
}
(dist[p]<0)?cout<<"-1":cout<<t-dist[p];
return 0;
}

正文

本题关键在于把最坏等待时间转化成中间乘坐公交的最长时间。

即每次乘车都看成a_i上车b_i开车,c_i抵达d_i下车,等待时间拉满。

此时车上时间为c_i-b_i

build建点时存储的几个变量:出发点/到达点,出发/到达最终时间,第idx号公交车,b_i.dist为这班车到达此点的乘车耗时。

把边排序的时候使用的排序规则为:

  • 最终时间相同时,乘车时间越长排越前面

  • 最终时间不同时,最终时间更长排越后面

dist需赋一个负的极小值(赋250或0xcf均可,赋250是因为250的二进制是1111\ 1010使用memset赋值保证最高位是负,赞美兰豆,虽然他是口糊的)

接下来枚举每个点,若为起点则将对应的ans赋为到该点的dist值;

若为终点,则用该点的ans+到该点那班车车上所花的时间值(b.dist)更新该点的dist值。

若到达p点是dist_p值小于零输出-1,若不是则输出t-dist_p。

标签:dist,idx,int,题解,ans,build,2005,Bus
From: https://www.cnblogs.com/AlpacaKing-presidential-palace/p/17790402.html

相关文章

  • [HDU 3483] A Very Simple Problem 题解
    题目描述快速求出下面式子的值:\[\left(\sum\limits_{k=1}^{N}k^{x}x^{k}\right)\bmodM\]其中\(1≤N,M≤2\times10^9\),并且\(1≤x≤50\)。题解(solution)对于该类题目,\(N\)很大,而\(x\)很小,考虑矩阵快速幂优化。对于每一个\(N\)的答案,我们用\(f(N)\)来......
  • P5537 【XR-3】系统设计 题解-哈希+线段树二分
    20231026P5537【XR-3】系统设计题解-哈希+线段树二分这个东西怎么会和哈希有关?!直接寄。Statement这个系统首先需要输入一棵\(n\)个点的有根树和一个长度为\(m\)的序列\(a\),接下来需要实现\(q\)个操作。操作分两种:1xlr表示设定起点为有根树的节点\(x\),接下来......
  • CF888E题解
    分析看到\(n\leq35\)的数据范围就想到了meet-in-middle。先爆搜出对于\(1\sim\frac{n}{2}\)和\(\frac{n}{2}\simn\)两个下标范围内在模意义下所有的和。然后用一个常见trick,就是枚举第二个部分的和,然后匹配第一个部分的和的最优解。显然匹配有两种情况,一种是......
  • chrome新版本http自动跳转https问题解决
    虽然是个好功能,但是部分内网业务还没做好https兼容,有的时候手工访问,还是变成https 解决办法:chrome://flags/找到:HTTPSUpgrades,修改disabled,重启解决,当然这个需要需要用户去调整,真正还需要服务去兼容https  ......
  • 在使用 Unity 2022 打包安卓项目时,遇到 gradle 无法访问或下载超级慢最终超时出错的问
    一般表现是打包最后一步会等待超长时间,最后报错,错误信息:PickedupJAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8FAILURE:Buildfailedwithanexception.*Whatwentwrong:Aproblemoccurredconfiguringrootproject'Gradle'.>Couldnotresolveallartifactsfor......
  • CCC 2023 题解 和 思考过程
    Trianglane水题,只要分情况判断中间和两侧有边叠牢的情况,每次减2#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>usingnamespacestd;typedeflonglongll;constintN=200010......
  • 「题解」Codeforces Round 905 (Div. 3)
    before终于有一篇题解是一次性更所有题的了。A.MorningProblemA.MorningSol&Code根据题意模拟即可。#include<bits/stdc++.h>typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT;int......
  • CF888C题解
    分析容易想到可以枚举每个字母,分别求其最小\(k\)取\(\min\)。思考对于一个\(k\),如何判其不合法。容易想到如果存在一个没有这个字符的长度大于等于\(k\)的子段,那么这个\(k\)就不合法。那么我们就知道如何求最小合法\(k\)了。找到最长的没有这个字符的子段,其长度加......
  • CF888A题解
    分析因为一个数不可能同时大于并小于它两边的数,所以两种数的集合不存在交集。所以分别扫一遍两种数的个数加在一起即可。代码#include<iostream>usingnamespacestd;constexprintMAXN(1000007);inta[MAXN];intn,ans;inlinevoidread(int&temp){cin>>t......
  • Redisson分布式锁主从一致性问题解决
    Redis联锁联锁(RedissonMultiLock)对象可以将多个RLock对象关联为一个联锁,实现加锁和解锁功能。每个RLock对象实例可以来自于不同的Redisson实例。如果负责储存分布式锁的某些Redis节点宕机以后,而且这些锁正好处于锁住状态,就会出现死锁问题。为了避免这种情况的发生,Redisson内部提供......