Submission #315593

#TimeUsernameProblemLanguageResultExecution timeMemory
315593nafis_shifatToll (BOI17_toll)C++14
100 / 100
499 ms21940 KiB
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int mxn=5e4+5;
const ll inf=1e15;
vector<int> adj[mxn];
vector<int> tps[mxn];
int l[5 * mxn],r[5 * mxn],w[5 * mxn];
int k,m,n;
ll d[mxn][6][6];

ll res[mxn];
struct query {
	int a,b;
	int ind;
	query(int x,int y,int z) : a(x),b(y),ind(z) {};
};
void solve(int b, int e, vector<query> q) {
	if(q.size() == 0) return;
	if(b == e) {
		for(auto i : q) res[i.ind] = -1;
		return;
	}
	int mid = b + e >> 1;
	for(int i = 0; i < k; i++) {
		for(int j = 0; j < k; j++) {
			d[mid][i][j] = i == j ? 0 : inf;
		}
	}

	for(int i = mid - 1; i >= b; i--) {
		for(int j = 0; j < k; j++) {

			for(int x = 0; x < k; x++) d[i][j][x] = inf;
			int u = i * k + j;
			for(int z : adj[u]) {
				int v = r[z];
				for(int x = 0; x < k; x++) {
					d[i][j][x] = min(d[i][j][x], d[i+1][v%k][x] + w[z]); 
				}
			}
		}
	}

	for(int i = mid + 1; i <= e; i++) {
		for(int j = 0; j < k; j++) {
			for(int x = 0; x < k; x++) d[i][j][x] = inf;
			int u = i * k + j;
			for(int z : tps[u]) {
				int v = l[z];
				for(int x = 0; x < k; x++) {
					d[i][j][x] = min(d[i][j][x], d[i-1][v%k][x] + w[z]); 
				}
			}
		}
	}

	vector<query> tm[2];


	for(auto i : q) {
		int x = i.a / k;
		int y = i.b / k;

		if(x<=mid && y >= mid) {
			ll ans = inf;
			for(int j = 0; j < k; j++) {
				ans = min(ans,d[x][i.a % k][j]+d[y][i.b % k][j]);
			}

			res[i.ind] = ans >= inf ? -1 : ans;
			continue;
		}

		tm[x > mid].push_back(i);
	}

	solve(b,mid,tm[0]);
	solve(mid+1,e,tm[1]);





}

int main() {
	int o;
	cin>>k>>n>>m>>o;

	for(int i = 1; i <= m; i++) {
		cin>>l[i]>>r[i]>>w[i];
		adj[l[i]].push_back(i);
		tps[r[i]].push_back(i);
	}

	vector<query> qs;

	for(int i = 1; i <= o; i++) {
		int a,b;
		cin>>a>>b;
		qs.push_back(query(a,b,i));
	}


	solve(0,(n + k - 1) / k,qs);

	for(int i = 1; i <= o; i++) {
		cout<<res[i]<<endl;
	}





	
}

Compilation message (stderr)

toll.cpp: In function 'void solve(int, int, std::vector<query>)':
toll.cpp:25:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |  int mid = b + e >> 1;
      |            ~~^~~
#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...