Submission #1266398

#TimeUsernameProblemLanguageResultExecution timeMemory
1266398abcdxyz123Toll (BOI17_toll)C++17
100 / 100
67 ms10468 KiB
#include<bits/stdc++.h>
#define inf 1000000000
#define pi pair<int,int>
#define fi first
#define se second
#define maxn 50005
#define maxk 10
using namespace std;
int k,n,m,q;
int dp[maxn][maxk];
vector<pi>in[maxn];
vector<pi>out[maxn];
int idb(int i)
{
    return i/k;
}
int lb(int i)
{
    return i*k;
}
int rb(int i)
{
    return min(n-1,(i+1)*k-1);
}
struct node
{
    int s,t,id;
    node(int s=0,int t=0,int id=0)
    {
        this->s=s;
        this->t=t;
        this->id=id;
    }
};
int ans[maxn];
void dnc(int l,int r,vector<node>&Query)
{
    if(l>r)return ;
    if(l==r)
    {
        for(auto[s,t,id]:Query)
        {
            ans[id]=inf;
        }
        return;
    }
    int mid=(l+r)/2;
    for(int i=l;i<=r;i++)
    {
        for(int u=lb(i);u<=rb(i);u++)
        {
            for(int v=0;v<k;v++)
            {
                dp[u][v]=inf;
            }
        }
    }
    for(int u=lb(mid);u<=rb(mid);u++)
    {
        dp[u][u%k]=0;
    }
    for(int i=mid-1;i>=l;i--)
    {
        for(int u=lb(i);u<=rb(i);u++)
        {
            for(int t=0;t<k;t++)
            {
                for(auto[v,w]:out[u])
                {
                    dp[u][t]=min(dp[u][t],dp[v][t]+w);
                }
            }
        }
    }
    for(int i=mid+1;i<=r;i++)
    {
        for(int u=lb(i);u<=rb(i);u++)
        {
            for(int t=0;t<k;t++)
            {
                for(auto[v,w]:in[u])
                {
                    dp[u][t]=min(dp[u][t],dp[v][t]+w);
                }
            }
        }
    }
    vector<node>QueryL;
    vector<node>QueryR;
    for(auto[s,t,id]:Query)
    {
        if(idb(t)<mid)QueryL.push_back(node(s,t,id));
        else if(idb(s)>mid)QueryR.push_back(node(s,t,id));
        else
        {
            if(idb(s)==idb(t))ans[id]=inf;
            else
            {
                ans[id]=inf;
                for(int x=0;x<k;x++)
                {
                    ans[id]=min(ans[id],dp[s][x]+dp[t][x]);
                }
            }
        }
    }
    dnc(l,mid-1,QueryL);
    dnc(mid+1,r,QueryR);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>k>>n>>m>>q;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        out[u].push_back({v,w});
        in[v].push_back({u,w});
    }
    vector<node>Query;
    for(int i=1;i<=q;i++)
    {
        int u,v;
        cin>>u>>v;
        if(idb(u)>=idb(v))ans[i]=inf;
        else
        {
            Query.push_back(node(u,v,i));
        }
    }
    dnc(0,idb(n),Query);
    for(int i=1;i<=q;i++)
    {
        if(ans[i]==inf)cout<<-1<<'\n';
        else cout<<ans[i]<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...