Submission #1301311

#TimeUsernameProblemLanguageResultExecution timeMemory
1301311Born_To_LaughToll (BOI17_toll)C++17
7 / 100
191 ms153892 KiB
// Born_To_Laugh - Hughie Do
#include <bits/stdc++.h>
#define alle(AC) AC.begin(), AC.end()
#define fi first
#define se second
using namespace std;
typedef long long ll;
[[maybe_unused]] const ll MOD = 998244353, INF = 3e18 + 7;
const int maxn = 5e4 + 10;
int k, n, m, q;
vector<pair<int,int>> adj[maxn];
vector<vector<vector<vector<ll>>>> dp;
ll ope(int a, int b){
    vector<ll> dist(k + 1, 0);
    int cur = a / k;
    int sth = b / k - a / k;
    if(sth <= 0)return -1;
    for(int j=0; j<20; ++j){
        if(sth & (1 << j)){
            vector<ll> nxt = dist;
            for(int x = 0; x < k; ++x){
                ll val = INF;
                for(int y = 0; y < k; ++y){
                    val = min(val, dist[y] + dp[cur][j][y][x]);
                }
                nxt[x] = val;
            }
            dist = nxt;
            cur += (1 << j);
        }
    }
    if(dist[b % k] < INF)return dist[b % k];
    else return -1;
}
void solve(){
    cin >> k >> n >> m >> q;
    dp.assign(
        (int)n / k + 1,
        vector<vector<vector<ll>>> (
            20,
            vector<vector<ll>> (
                k + 1,
                vector<ll> (
                    k + 1,
                    INF
                )
            )
        )
    );
    for(int i=1; i<=m; ++i){
        int a, b, c;cin >> a >> b >> c;
        adj[a].push_back({b, c});
        dp[a / k][0][a % k][b % k] = c;
        // cout << a / k << ' ' << 0 << ' ' << a % k << ' ' << b % k << ' ' << c << " ?? \n";
    }
    for(int i=(int)n / k; i>=0; --i){
        for(int j=1; j<20; ++j){
            if(i + (1 << j) > int(n / k))break;
            for(int x = 0; x < k; ++x){
                for(int y = 0; y < k; ++y){
                    for(int z = 0; z < k; ++z){
                        dp[i][j][x][y] = min(
                            dp[i][j][x][y],
                            dp[i][j - 1][x][z] + dp[i + (1 << (j - 1))][j - 1][z][y]
                        );
                    }
                    // cout << i << ' ' << j << ' ' << x << ' ' << y << ' ' << dp[i][j][x][y] << '\n';
                }
            }
        }
    }
    while(q--){
        int a, b;cin >> a >> b;
        cout << ope(a, b) << '\n';
    }
}
signed main(){
    // freopen("inp.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#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...