Submission #1239102

#TimeUsernameProblemLanguageResultExecution timeMemory
1239102thuhienneToll (BOI17_toll)C++20
100 / 100
67 ms25964 KiB
#include <bits/stdc++.h>
using namespace std;

#define FastIO ios_base::sync_with_stdio(0);cin.tie(nullptr);
#define MULTEST int t;cin >> t;while (t--) solve();
#define rf(__abc__) freopen(__abc__".inp","r",stdin);freopen(__abc__".out","w",stdout);

const int mod = 1e9 + 7;

long long pw(long long x,long long y) {
    if (y == 0) return 1;
    if (y % 2 == 0) {
        long long a = pw(x,y/2);
        return a*a%mod;
    } else {
        long long a = pw(x,y - 1);
        return a*x%mod;
    }
}

int add(int x,int y) {
    x += y;
    if (x >= mod) x -= mod;
    return x;
}

int subtract(int x,int y) {
    x -= y;
    if (x < 0) x += mod;
    return x;
}

int mul(long long x,int y) {
    x *= y;
    if (x >= mod) x %= mod;
    return x;
}

///Code goes here

struct matrix {
    long long data[5][5];
    int row,col;
    matrix () {

    }
    matrix (int r,int c) {
        row = r,col = c;
        for (int i = 0;i < row;i++) for (int j = 0;j < col;j++) data[i][j] = 0;
    }
    matrix operator * (const matrix & b) {
        matrix a = *this;
        matrix c(a.row,b.col);
        for (int i = 0;i < a.row;i++) {
            for (int j = 0;j < b.col;j++) {
                c.data[i][j] = mod;
                for (int k = 0;k < a.col;k++) {
                    c.data[i][j] = min(c.data[i][j],a.data[i][k] + b.data[k][j]);
                }
            }
        }
        return c;
    }
};

matrix mat[50009];
//order:left -> right

int k,n,m,q;
vector <pair<int,int>> adj[50009];

struct query {
    int l,r,index;
} ask[10009];

matrix answer[10009];

matrix acc[50009];
void dnc(int l,int r,vector <query> & bruh) {
    if (l == r) {
        for (auto x : bruh) {
            answer[x.index] = mat[l];
        }
        return;
    }
    int mid = (l + r) >> 1;
    acc[mid] = mat[mid];
    acc[mid + 1] = mat[mid + 1];
    for (int i = mid - 1;i >= l;i--) {
        acc[i] = mat[i] * acc[i + 1];
    }
    for (int i = mid + 2;i <= r;i++) {
        acc[i] = acc[i - 1] * mat[i];
    }
    vector <query> left,right;
    for (auto x : bruh) {
        if (x.l > mid) right.push_back(x);
        else if (x.r <= mid) left.push_back(x);
        else answer[x.index] = acc[x.l] * acc[x.r];
    }
    dnc(l,mid,left);
    left.clear();
    dnc(mid + 1,r,right);
    right.clear();
}

int main() {
    //rf("");
    FastIO
    //MULTEST

    cin >> k >> n >> m >> q;
    n = (n + k - 1)/k*k;
    for (int i = 1;i <= m;i++) {
        int u,v,w;cin >> u >> v >> w;
        adj[v].push_back({u,w});
    }

    for (int i = 0;i * k <= n;i++) {
        //i*k,i*k + 1,...,i*k + k - 1
        ///init
        for (int d = 0;d < k;d++) {
            for (int b = 0;b < k;b++) {
                mat[i].data[d][b] = 0;
            }
        }
        mat[i].row = mat[i].col = k;
        ///create min-plus matrix
        for (int node = i*k;node <= i*k + k - 1;node++) {
            for (auto c : adj[node]) {
                int child = c.first,cost = c.second;
                mat[i].data[child%k][node%k] = cost;
            }
        }
        ///fill in missing value
        for (int d = 0;d < k;d++) {
            for (int b = 0;b < k;b++) {
                if (!mat[i].data[d][b]) mat[i].data[d][b] = mod;
            }
        }
    }
    vector <query> allquery;
    for (int i = 1;i <= q;i++) {
        int l,r;cin >> l >> r;
        ask[i] = {l,r,i};
        if (l/k != r/k) allquery.push_back({l/k + 1,r/k,i});
    }
    dnc(1,n,allquery);
    for (int i = 1;i <= q;i++) {
        if (ask[i].l/k == ask[i].r/k) cout << -1 << '\n';
        else cout << (answer[i].data[ask[i].l%k][ask[i].r%k] >= 1e9 ? -1 : answer[i].data[ask[i].l%k][ask[i].r%k]) << '\n';
    }

    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...