제출 #298035

#제출 시각아이디문제언어결과실행 시간메모리
298035miss_robotToll (BOI17_toll)C++14
100 / 100
264 ms73596 KiB
#include <bits/stdc++.h>

#pragma GCC optimize("O3")
#define int long long

using namespace std;

signed main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	int k, n, m, o, L = 16, INF = numeric_limits<int>::max()/8;
	cin >> k >> n >> m >> o;
	vector< vector< vector< vector<int> > > > g(L, vector< vector< vector<int> > >((n+k-1)/k, vector< vector<int> >(k, vector<int>(k, INF))));
	while(m--){
		int a, b, t;
		cin >> a >> b >> t;
		g[0][a/k][a%k][b%k] = t;
	}
	for(int i = 1; i < L; i++)
		for(int j = 0; j < (n+k-1)/k-(1<<i); j++)
			for(int u = 0; u < k; u++)
				for(int v = 0; v < k; v++)
					for(int w = 0; w < k; w++)
				g[i][j][u][v] = min(g[i][j][u][v], g[i-1][j][u][w]+g[i-1][j+(1<<(i-1))][w][v]);
	while(o--){
		int a, b, pos;
		cin >> a >> b;
		if(a/k == b/k){
			cout << "-1\n";
			continue;
		}
		vector<int> dis(k, INF);
		dis[a%k] = 0;
		pos = a/k;
		for(int i = L-1; i >= 0; i--){
			if(pos + (1<<i) > b/k) continue;
			vector<int> newdis(k, INF);
			for(int u = 0; u < k; u++)
				for(int v = 0; v < k; v++)
					newdis[v] = min(newdis[v], dis[u]+g[i][pos][u][v]);
			dis = newdis;
			pos += (1<<i);
		}
		cout << (dis[b%k]==INF?-1:dis[b%k]) << "\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...