Submission #441832

#TimeUsernameProblemLanguageResultExecution timeMemory
441832dutchToll (BOI17_toll)C++17
100 / 100
228 ms30788 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define sp << ' ' <<
#define nl << '\n'

const int MAXN = 1e5, INF = 1e16;

vector<array<int, 2>> g[MAXN];
int n, k, m, o;

struct SegmentTree{
	using T = array<array<int, 5>, 5>;
	int sz = 1, l, r;
	vector<T> a; T ID, NA;
	T comb(const T &x, const T &y, int z){
		if(x == NA) return y;
		if(y == NA) return x;
		T res = ID;
		for(int i=0; i<k; ++i)
			for(int u=0; u<k; ++u)
				for(auto &[v, w] : g[(z-1)*k+u])
					for(int j=0; j<k; ++j)
						res[i][j] = min(res[i][j], x[i][u] + w + y[v%k][j]);
		return res;
	}
	void init(){
		int N = (n + k - 1) / k;
		while((sz+=sz)<N);
		for(int i=0; i<5; ++i)
			ID[i] = {INF, INF, INF, INF, INF};
		for(int i=0; i<5; ++i)
			NA[i] = {-1, -1, -1, -1, -1};
		a.assign(2*sz, ID);
		build(0, 0, sz);
	}
	void build(int x, int lx, int rx){
		if(rx - lx == 1){
			for(int i=0; lx*k+i<n && i<k; ++i) a[x][i][i] = 0;
			return;
		}
		int mx = (lx + rx) / 2;
		build(2*x+1, lx, mx);
		build(2*x+2, mx, rx);
		if(mx >= n) a[x] = a[2*x+1];
		else a[x] = comb(a[2*x+1], a[2*x+2], mx);
	}
	T query(int x, int lx, int rx){
		if(r<=lx || rx<=l) return NA;
		if(l<=lx && rx<=r) return a[x];
		int mx = (lx + rx) / 2;
		return comb(query(2*x+1, lx, mx), query(2*x+2, mx, rx), mx);
	}
	int query(int L, int R){
		l = L/k, r = R/k+1;
		return query(0, 0, sz)[L%k][R%k];
	}
};

signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin >> k >> n >> m >> o;
	while(m--){
		int u, v, w; cin >> u >> v >> w;
		g[u].push_back({v, w});
	}

	SegmentTree st;
	st.init();

	while(o--){
		int l, r; cin >> l >> r;
		l = st.query(l, r);
		cout << (l == INF ? -1 : l) << '\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...