Submission #164078

#TimeUsernameProblemLanguageResultExecution timeMemory
164078nvmdavaToll (BOI17_toll)C++17
100 / 100
368 ms63056 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second
#define pb push_back
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define N 50005
#define INF 0x3f3f3f3f
#define MOD 1000000007LL
#define LEN 240

int fl[250][240][240];
vector<pair<pair<int, int>, int> > tr[250], buck[250];

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int k, n, m, o;
    cin>>k>>n>>m>>o;
    memset(fl, 0x3f, sizeof fl);

    for(int i = 0; i < 210; ++i)
    	for(int j = 0; j < 240; ++j)
    		fl[i][j][j] = 0;
    
    while(m--){
    	int a, b, t;
    	cin>>a>>b>>t;
    	if(a / LEN != b / LEN){
    		tr[a / LEN].push_back({{a % k, b % k}, t});
    	} else {
    		buck[a / LEN].push_back({{a % LEN, b % LEN}, t});
    	}
    }
    for(int i = 0; i < 210; ++i){
    	sort(buck[i].begin(), buck[i].end(), [](const pair<pair<int, int>, int>& lhs, const pair<pair<int, int>, int>& rhs){
    		return lhs.ff.ss < rhs.ff.ss;
    	});
    	for(auto& x : buck[i]){
    		for(int j = 0; j <= x.ff.ff; ++j){
    			fl[i][j][x.ff.ss] = min(fl[i][j][x.ff.ss], fl[i][j][x.ff.ff] + x.ss);
    		}
    	}
    }
    while(o--){
    	int a, b;
    	cin>>a>>b;
    	int ans = INF;
    	if(a / LEN == b / LEN){
    		ans = fl[a / LEN][a % LEN][b % LEN];
    	} else {
    		vector<int> tmp(k);
    		for(int i = 0; i < k; ++i){
    			tmp[i] = fl[a / LEN][a % LEN][LEN - k + i];
    		}
    		vector<int> tmp3(k, INF);
    		for(auto& x : tr[a / LEN])
    			tmp3[x.ff.ss] = min(tmp3[x.ff.ss], tmp[x.ff.ff] + x.ss);
    		swap(tmp, tmp3);
    		for(int i = a / LEN + 1; i < b / LEN; ++i){
    			vector<int> tmp2(k, INF);
    			for(int j = 0; j < k; ++j){
    				for(int l = 0; l < k; ++l){
    					tmp2[l] = min(tmp2[l], tmp[j] + fl[i][j][LEN - k + l]);
    				}
    			}
    			swap(tmp, tmp2);

	    		vector<int> tmp4(k, INF);
	    		for(auto& x : tr[i])
	    			tmp4[x.ff.ss] = min(tmp4[x.ff.ss], tmp[x.ff.ff] + x.ss);
	    		swap(tmp, tmp4);
    		}
    		for(int i = 0; i < k; i++){
    			ans = min(ans, tmp[i] + fl[b / LEN][i][b % LEN]);
    		}
    	}
    	cout<<(ans == INF ? -1 : ans)<<'\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...