雨中冒险

【问题描述】
有 n 个节点,标号为 1..n。m 条双向公路连接着这些节点,其中第 i 条公路
连接着 u_i 和 v_i,从一端走到另一端需要 w_i 秒。现在,小 Y 打算从学校回到
家里。
学校是节点 1,小 Y 家是节点 n,保证存在至少一条从节点 1 到节点 n 的路
径。
在第 0 秒,小 Y 身处节点 1,他的目标是尽早到达节点 n。根据天气预报,
接下来会有 k 次暴雨,第 i 次暴雨的时间为第 l_i 秒至第 r_i 秒,保证每次暴雨
的时间段互不重叠(包括起止时间)。由于小 Y 忘了带伞,因此在下雨期间,他
只能躲在某个节点里面避雨。如果某一个时刻在下暴雨,而小 Y 还在某条公路上,
那么他会被淋惨。
为了帮助小 Y 尽快回到家,上帝决定实现小 Y 一个愿望。小 Y 可以指定某一
条道路,然后这条道路两端的节点将合并成一个节点(合并出的节点拥有原来两
个节点的所有出边)。
请你帮小 Y 计算,在不被淋惨的前提下最早第多少秒他能回到自己家中?
注:对于一场第 l..r 秒的暴雨,若小 Y 第 r 秒从节点出发,或者第 l 秒到
达某个节点,那么他是不会淋到雨的。
【输入】
输入文件名:rain.in
第一行三个数 n、m、k。
接下来 m 行,第 i 行三个整数表示 u_i、v_i、w_i。
接下来 k 行,第 i 行两个整数表示 l_i、r_i。全国信息学奥林匹克联赛(NOIP2016)模拟赛
提高组 day1
【输出】
输出文件名:rain.out
第一行一个整数,表示小 Y 最早第多少秒能回到家中。
【数据范围】
测试点 1..6:k = 0
测试点 7..12:n、m、k≤10 3
测试点 1..20:2≤n≤10 5 ,1≤m≤2*10 5 ,0≤k≤10 5 ,1≤w_i≤10 4 ,
0≤l_i<r_i≤10 9 ,且保证输入的暴雨时间段互不相交、l_i 严格递增。

首先,建立分层图:

dist[i][0/1]表示i点,0表示未缩点,1表示已缩

现在唯一的问题就是怎麽算出到达时间

at[i][0/1]表示i点0/1状态的上一场雨的编号,令为l

要幺直接走

或者对于每一场雨的间隔走w,走最靠前的大于w的边权

这个怎麽求?

用倍增,存间隔长的最大值

此题奇鬼无比,还要用set优化,玄学

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
typedef long long lol;
typedef pair<int,int> zt;
struct Node
{
    int next,to;
    int dis;
} edge[400005];
int num,head[100005],n,m,k;
int dist[100005][2],L[100005],R[100005],st[20][100005],p[100005];
int at[100005][2];
bool vis[100005][2];
lol gi()
{
    lol x=0;
    char ch=getchar();
    while (ch<‘0‘||ch>‘9‘) ch=getchar();
    while (ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x;
}
void add(int u,int v,int d)
{
    num++;
    edge[num].next=head[u];
    head[u]=num;
    edge[num].to=v;
    edge[num].dis=d;
}
int count(int x,int w,int &np,int as)
{
    int i,l;
    l=as+1;
    x=max(R[as],x);
    if (L[as+1]-x>=w)
    {
        np=as;
        return x+w;
    }
    for (i=17; i>=0; i--)
    {
        if (l+(1<<i)<=k&&st[i][l]<w)
        {
            l+=(1<<i);
        }
    }
    np=l;
    return R[l]+w;
}
void SPFA()
{
    memset(dist,127/3,sizeof(dist));
    set<zt>Q;
    Q.insert((zt){1,0});
    dist[1][0]=0;
    at[1][0]=0;
    while (Q.size())
    {
        zt u=*Q.begin();
        Q.erase(Q.begin());
        vis[u.first][u.second]=0;
        for (int i=head[u.first]; i; i=edge[i].next)
        {
            int v=edge[i].to,np1,np2;
            int s=0,ss=0;
            if (u.second==0)
                s=count(dist[u.first][0],edge[i].dis,np1,at[u.first][0]);
            if (u.second==1)
                ss=count(dist[u.first][1],edge[i].dis,np2,at[u.first][1]);
            if (u.second==0&&dist[v][0]>s)
            {
                dist[v][0]=s;
                at[v][0]=np1;
                if (vis[v][0]==0)
                {
                    vis[v][0]=1;
                    Q.insert((zt){v,0});
                }
            }
            if (u.second==1&&dist[v][1]>ss)
            {
                dist[v][1]=ss;
                at[v][1]=np2;
                if (vis[v][1]==0)
                {
                    vis[v][1]=1;
                    Q.insert((zt){v,1});
                }
            }
            if (u.second==0&&dist[v][1]>dist[u.first][0])
            {
                dist[v][1]=dist[u.first][0];
                at[v][1]=at[u.first][0];
                if (vis[v][1]==0)
                {
                    vis[v][1]=1;
                    Q.insert((zt){v,1});
                }
            }
        }
    }
}
int main()
{
    int u,v,i,j;
    int w;
    cin>>n>>m>>k;
    for (i=1; i<=m; i++)
    {
        u=gi();
        v=gi();
        w=gi();
        add(u,v,w);
        add(v,u,w);
    }
    L[k+1]=2e9;
    for (i=1; i<=k; i++)
    {
        L[i]=gi();
        R[i]=gi();
    }
    for (i=1; i<=k; i++)
        st[0][i]=L[i+1]-R[i],p[i]=max(st[0][i],p[i-1]);
    for (i=1; i<=17; i++)
    {
        for (j=1; j<=k; j++)
            if (j+(1<<i)-1<=k)
            {
                st[i][j]=max(st[i-1][j],st[i-1][j+(1<<i-1)]);
            }
            else break;
    }
    SPFA();
    //for (i=1;i<=n;i++)
    //cout<<dist[i][0]<<‘ ‘<<dist[i][1]<<endl;
    cout<<min(dist[n][1],dist[n][0]);
}
时间: 2024-10-11 12:45:52

雨中冒险的相关文章

雨中行船

吃过中饭,带着儿子我们去朝阳公园散步,从四环走,选择东门进. 第一次从东五号门进,这个门靠近沙排体育馆,奥运会的时候曾在此看过一场比赛,赛事结束后,这里显得十分冷清,加上今天阴冷的天气感觉有些萧条. 进门就能看到马戏宣传标语,上次到公园搭帐篷的时候就看到宣传广告,因为时间的关系,上次没有去现场体验,这回算是歪打正着,国庆长假选择宅在家里,带儿子看场马戏也当是感受下不同的生活体验. 马戏场搭在公园万人广场附近,一个硕大的白色蒙古包屹立在绿色广场旁,今天天气转凉,雨水呼之欲出,即使光线不是很好,还有

雨中重装徒步攀登清凉峰

<雨中重装徒步攀登清凉峰> 经历忙碌的一周工作后,本该在周六睡个懒觉,因报名参加了天涯俱乐部组织的重装徒步攀登清凉峰活动,只能在五点起床,洗漱,吃完早饭后,背上登山包后赶往集合地点. 清凉峰,天目山脉的主峰,是皖南浙西山区仅次于黄山主峰的第二高峰,海拔1784米.我曾在去年公司组织的徒步徽杭古道的途中向往之,只是古道行程在走到海拔1050米的蓝天凹后,就往下雪堂方向下山了,未能登顶,心存遗憾.此次终于成行,甚感高兴,同时也担心是否能成功登顶,因为天气预报有雨,山路崎岖,加上身负十多公斤的装备,

上海传智程序员携手设计狮美女雨中烧烤!!

夏天夏天,这次你最终干干脆脆的走了,秋天秋天,你最终清清爽爽的来了!抓住那金秋10月的尾巴,上海传智播客java班的程序员们携手网页平面的设计狮们来到了上海顾村公园開始他们今天的户外烧烤一日游.姑娘们.帅哥们.准备好了吗?出发! 但是天公不作美,从早上就開始下起了淅沥沥的小雨,只是这丝毫没有浇灭我们出游的热情.并且这种天气才干让我们java班和网页班的同学们感受到情深深雨蒙蒙的氛围啊.经过了大约2个小时左右的车程,各小分队開始陆续到达目的地.集合啦,活动就要開始咯...... 都喊開始了.你才来

上海传智程序猿携手设计狮美女雨中烧烤!!

夏天夏天,这次你终于干干脆脆的走了,秋天秋天,你终于清清爽爽的来了!抓住那金秋10月的尾巴,上海传智播客java班的程序猿们携手网页平面的设计狮们来到了上海顾村公园开始他们今天的户外烧烤一日游!姑娘们,帅哥们,准备好了吗?出发! 可是天公不作美,从早上就开始下起了淅沥沥的小雨,不过这丝毫没有浇灭我们出游的热情,而且这样的天气才能让我们java班和网页班的同学们感受到情深深雨蒙蒙的氛围啊!经过了大约2个小时左右的车程,各小分队开始陆续到达目的地.集合啦,活动就要开始咯...... 都喊开始了,你才

她在雨中淋雨,身体超好看得我实在受不鸟

全日行情收官,延续昨日放量突破3406新高的势头,今日继续跳空上扬.势头可谓旱地拔葱,平步青云.但与去年权重独涨时候已经是迥然不同.今日标准普涨格局,量能呈现有效放大态势,全场无一翻绿板块.而涨幅榜内也是二八齐鸣的架势,电子,钢铁,贸易,建筑,运输,连券商也冲上前六席位.由此可见,今日行情由二八轮动,变为二八齐涨,中小板题材股与二股权重皆有表现.此等行情正好演绎了牛市风采,各股各版块皆有机会. 而随着昨日放量有效突破横盘震荡近3个月来的3400高点后,今日已经达到3503点.加之今日跳空高开,尾

《雨中的3分58秒》

关键不在于开始时能跑多快,而在于疲倦时能跑多快. 距离终点最遥远的不是第一圈,而是第三圈.第三圈是个缩影,但非关生命,而是逆境.一次次必须渡过的难关.没有玩具的落寞圣诞节.午夜枯坐公交车站的愁苦--到了第三圈,除了咬紧牙关,别无选择. 训练是净化的仪式,由此衍生速度和力量.比赛是死亡的仪式,智慧由此而来. 长跑后的慢走放松是一种缓慢的奢侈,一种带有深刻疼痛的满足感. 你要知道,并没有人承诺过你世上有宇宙正义这样的事情. 还有一个关于计划的来着,我找找再贴上来吧 原文地址:https://www.

某校内题 rain

Task 3. 雨中冒险 ( rain.cpp/c/pas) [ 问题描述] 有 n 个节点,标号为 1..n. m 条双向公路连接着这些节点,其中第 i 条公路 连接着 u_i 和 v_i,从一端走到另一端需要 w_i 秒.现在,小 Y 打算从学校回到 家里. 学校是节点 1,小 Y 家是节点 n,保证存在至少一条从节点 1 到节点 n 的路 径. 在第 0 秒,小 Y 身处节点 1,他的目标是尽早到达节点 n.根据天气预报, 接下来会有 k 次暴雨,第 i 次暴雨的时间为第 l_i 秒至第

伴雨夜谈【即便大雨倾盆,也无法击起心中的波澜】

昨天下午1点到自己写这篇文章,这场雨已经持续了30多个小时了,曾经不止一次说过自己喜欢这种下雨的天气,现在我还是想说:‘我喜欢雨天,因为雨天总会让我的心平静到不起一点波澜’. [致天蝎座的我们]:http://www.duomi.com/dmplist/779516094409868216 听着别人收集的音乐,因为第一首曲俘获了自己的心,这种感觉真的很好.看着外面的树随风飘扬,雨打在窗户上的声音也是一首美妙的曲.很久都没将自己置于这种环境中了,扬声器里面旋律.雨打的曲.风演绎出的MV和屏幕上不断

青春三部曲(《且听风吟》,《一九七三年的弹子球》,《寻羊冒险记》)--[日]村上春树

原本想把这三本书分开来着,但是细想了一下,还是和在一起好一些 村上春树的青春三部曲,<且听风吟>,<一九七三年的弹子球>,<寻羊冒险记> 我是先看了<寻羊冒险记>,然后再去读<且听风吟>,<一九七三你的弹子球> 进来看了不少关于村上春树的作品,怎么说好呢?那种风格和文体我想是吸引了我! 三本书,实在不错! 下面是我的书摘: <寻羊冒险记> * 失业使我心情畅快起来.我正一点点简化.我失去了故乡,失去了青春,失去了朋友,失去