Submission #1239303

#TimeUsernameProblemLanguageResultExecution timeMemory
1239303lambd47Toll (BOI17_toll)C++20
0 / 100
119 ms176704 KiB
#include <bits/stdc++.h>

#define int long long
using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int T=180;
const int INF=1e15;

typedef array<array<int,5>,5> mat;
void solve() {
    int k,n,m,q;cin>>k>>n>>m>>q;
    n/=T;n*=T;n+=T;
    const array<int,5> BigChungus={INF,INF,INF,INF,INF};
    const mat HugeChungus={BigChungus,BigChungus,BigChungus,BigChungus,BigChungus};
    vector<mat> adj(n/k,HugeChungus);
    L(i,0,m-1){
        int a,b,w;cin>>a>>b>>w;
        adj[a/k][a%k][b%k]=w;
    }
    auto merge=[&](mat a,mat& b)->mat{
        mat aux=HugeChungus;
        L(i,0,k-1){
            L(j,0,k-1){
                L(f,0,k-1){
                    aux[i][j]=min(aux[i][j],a[i][f]+b[f][j]);
                }
            }
        }
        return aux;
    };
/*
    for(int i=t-1;i<n;i+=t){
        for(int j=0;j<t;j+=k){
            int at=i-k+1-j*k;
            if(j==0){
                l(f,0,k-1)dp[at/k][f][f]=0;
            }
            else{
                l(f,0,k-1)dp[at/k]=merge(adj[at/k],dp[at/k+1]);
            }
        }
    }
    */

    
    const int lg=16;
    vector<vector<mat>> dp(lg,vector<mat>(n/k));
    int lim=n/k;
    L(i,0,lg-1){
        L(j,0,lim-1){
            if(i==0){
                dp[i][j]=adj[j];
            }
            else{
                if((1<<(i-1))+j<lim){
                    dp[i][j]=merge(dp[i-1][j],dp[i-1][j+(1<<(i-1))]);
                }
            }
        }
    }
    while(q--){
        int a,b;cin>>a>>b;
        if(a>b)swap(a,b);
        int na=a/k;
        int nb=b/k;
        int d=nb-na;
        if(nb==na){
            cout<<-1<<"\n";continue;
        }
        bool ok=0;
        mat aux;
        L(i,0,lg-1){
            if(d&(1<<i)){
                if(!ok){
                    aux=dp[i][na];
                    na+=(1<<i);
                }
                else{
                    ok=1;
                    aux=merge(aux,dp[i][na]);
                    na+=(1<<i);
                }
            }
        }
        cout<<(aux[a%k][b%k]<INF?aux[a%k][b%k]:-1)<<"\n";
    }

}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(T--) {
        solve();
    }

	return 0;
}
#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...