首页 > 其他分享 >P9751 [CSP-J 2023] 旅游巴士

P9751 [CSP-J 2023] 旅游巴士

时间:2024-08-11 20:27:11浏览次数:14  
标签:P9751 int st next low 2023 now CSP mod

原题链接

分析

很逆天的一道题

设 \(dp[i][j]\) 为到达第 \(i\) 个点的时刻 \(t\) 且满足 \(t\mod k=j\) 的最小 \(t\)

则有答案为 \(dp[n][0]\)

更新也很简单,设当前点为 \(u\),当前时间为 \(t\) 需要遍历的下一个点 \(v\),则有 \(dis[v][(t+1)\%k]=dis[u][t\%k]+1\)

如果道路还没开放,我们可以原地等 \(k\) 的倍数时间(等价于在起点等),因为我们只更新 \([(t+1)\% k]\),其他的时间自然会有其他时刻来更新

这个设计非常巧妙,避开了 \(a_i\) 的限制

code

#include<bits/stdc++.h>
using namespace std;
/*
#define int long long
#define double long double
#define lowbit(x) ((x)&(-x))
const int inf=1e18;
const int mod=1e9+7;

const int N=4e5;
int qpow(int a,int n)
{
    int res=1;
    while(n)
    {
        if(n&1) res=res*a%mod;
        a=a*a%mod;
        n>>=1;
    }
    return res;
}
int inv(int x)
{
    return qpow(x,mod-2);
}
int fa[2000005];
int finds(int now){return now==fa[now]?now:finds(fa[now]);}

vector<int> G[200005];

int dfn[200005],low[200005];
int cnt=0,num=0;
int in_st[200005]={0};
stack<int> st;
int belong[200005]={0};

void scc(int now,int fa)
{
    dfn[now]=++cnt;
    low[now]=dfn[now];
    in_st[now]=1;
    st.push(now);

    for(auto next:G[now])
    {
        if(next==fa) continue;

        if(!dfn[next])
        {
            scc(next,now);
            low[now]=min(low[now],low[next]);
        }
        else if(in_st[next])
        {
            low[now]=min(low[now],dfn[next]);
        }
    }

    if(low[now]==dfn[now])
    {
        int x;
        num++;
        do
        {
            x=st.top();
            st.pop();
            in_st[x]=0;
            belong[x]=num;
        }while(x!=now);
    }
}
vector<int> prime;
bool mark[200005]={0};
void shai()
{
    for(int i=2;i<=200000;i++)
    {
        if(!mark[i]) prime.push_back(i);

        for(auto it:prime)
        {
            if(it*i>200000) break;

            mark[it*i]=1;
            if(it%i==0) break;
        }
    }
}
*/

struct node
{
    int to,cost;
};
vector<node> G[10004];

struct fresh
{
    int place,mod,t;
    bool operator<(const fresh&c)const
    {
        return c.t<t;
    }
};


int dis[10005][105];
void solve()
{
    memset(dis,0x3f,sizeof dis);
    int n,m,k;
    cin>>n>>m>>k;

    for(int i=1;i<=m;i++)
    {
        int x,y,t;
        cin>>x>>y>>t;

        G[x].push_back({y,t});
    }


    priority_queue<fresh> q;
    q.push({1,0,0});

    while(q.size())
    {
        auto [now,mod,t]=q.top();
        q.pop();
        if(dis[now][mod]<=t) continue;

        dis[now][mod]=t;
        for(auto next:G[now])
        {
            auto [to,wait]=next;

            if(wait<=t)
            {
                q.push({to,(mod+1)%k,t+1});
            }
            else
            {
                int add=(wait-t)/k+((wait-t)%k!=0);
                q.push({to,(mod+1)%k,t+add*k+1});
            }
        }
    }

    if(dis[n][0]>1e9) cout<<-1;
    else cout<<dis[n][0];
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int TT=1;
    //cin>>TT;
    while(TT--) solve();
    return 0;
}


标签:P9751,int,st,next,low,2023,now,CSP,mod
From: https://www.cnblogs.com/pure4knowledge/p/18353858

相关文章

  • 1998-2023年上市公司生命周期测算数据(含原始数据+计算代码+结果)
    1998-2023年上市公司生命周期测算数据(含原始数据+计算代码+结果)1、时间:1998-2023年2、来源:上市公司年报、csmar3、指标:证券代码、证券简称、资产总计、净利润、购建固定资产无形资产和其他长期资产支付的现金、营业收入增长率B、股利分配率、行业代码、上市日期、公司成立日......
  • WPS Office 2023专业版 v12.8.2.17149v2 精简优化版
    概述WPSOffice是由金山软件股份有限公司自主研发的一款办公软件套装,可以实现办公软件最常用的文字、表格、演示等多种功能。具有内存占用低、运行速度快、体积小巧、强大插件平台支持、免费提供海量在线存储空间及文档模板、支持阅读和输出PDF文件、全面兼容微软Office97-2010格......
  • 『模拟赛』暑假集训CSP提高模拟18
    Rank致敬传奇不挂分Rank5模拟赛A.Mortis原[ABC302G]Sortfrom1to4签,致敬传奇abc_g作签到题。虽然但是还是想了1h,好在最后成功切了。具体解释看看题解,求个赞。点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintRatio=0;constintN=2......
  • 暑假集训CSP提高模拟18
    \[暑假集训CSP提高模拟\1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1\]Verygoodproblem,thismakemynewsrotate.A.Mortis考虑到应该先写个假的暴力.对于暴力思路,可以想到,假如我们每次都将一个不在它位置上的数字移到它应该在的地方的时候,另一个数字也刚好移到正确的位置,这......
  • csp-j2023第四题 旅游巴士
    旅游巴士这道题在一年之前的csp-j中并没有做(我是一个蒟蒻)回看本题,又有了新的想法对于每一层i我们将其看成走到这是的时间jmodk的余数很显然,为了让我们更快的通过,等待时间+当前时间>=限制时间是最优的/*使用分层图,跑dijkstra堆优化的最短路在限制时间那部分,若小于限制时间,......
  • CSP17
    请注意:题目背景与题目可能没有关系第一题,性质题,找到序列的最大值与最小值,我们发现如果只有正数的话和只有负数的话都很好处理,正数正序处理类似前缀加,负数后缀加,那如果正负都有,该怎么办呢?其实我们可以吧序列全变为正的或负的吧,但是需要比较一下最大值最小值,如果都变成正的话,对......
  • CVE-2023-38633~XXE注入【春秋云境靶场渗透】
    今天我们来攻克春秋云境CTF的CVE-2023-38633#我们通过抓包来构造POC来查找/etc/passwd<?xmlversion="1.0"encoding="UTF-8"standalone="no"?><svgwidth="1000"height="1000"xmlns:xi="http://www.w3.org/2001/XInclude&......
  • [赛记] 暑假集训CSP提高模拟17
    符号化方法初探100pts签到题?做了得有1.5h+;考虑全是正数或全是负数的情况,那么我们可以对其做一次类似于前缀和或后缀和的操作,需要$n-1$次;所以我们只需将数列中的数全部转化成正数或负数即可,具体地,找出所有正数的和和所有负数的和,如果前者比后者要大,那么就将所有正数加起......
  • [考试记录] 2024.8.10 csp-s 模拟赛18
    80+20+0+70=170第三题应该有10分暴力的,但我没打。T1星际旅行题面翻译总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同。样例#1样例输入#15412131415样例输......
  • 暑假集训CSP提高模拟17
    \[暑假集训CSP提高模拟\operatorname{EIJ}_{2}(6)-1\]\(\operatorname{EIJ}_{k}(A)\)定义为有\(A\)个球,\(k\)个盒子,盒子相同,球不同,把全部球放入的方案数Hint易知\(\operatorname{EIJ}_k(A)=\dfrac{A^k}{k!}\),详见这篇文章其实我觉得构造的过程更有意思:对一个给定的正......