Submission #1204477

#TimeUsernameProblemLanguageResultExecution timeMemory
1204477PlayVoltzToll (BOI17_toll)C++20
100 / 100
259 ms47008 KiB
#include <cstdio>
#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
#include <numeric>
#include <cassert>
using namespace std;

#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

int n, k;
vector<vector<pii> > graph;

vector<vector<int> > combine(vector<vector<int> > a, int r, vector<vector<int> > b){
	vector<vector<int> > dp(5, vector<int>(5, LLONG_MAX/100000));
	for (int node=r*k; node<min(n, (r+1)*k); ++node)for (auto num:graph[node])for (int i=0; i<k; ++i)for (int j=0; j<k; ++j)dp[i][j]=min(dp[i][j], a[i][node%k]+b[num.fi%k][j]+num.se);
	return dp;
}

struct node{
	int s, e, m;
	vector<vector<int> > dp;
	node *l, *r;
	
	node(int S, int E){
		s = S, e = E, m = (s+e)/2;
		if (s!=e){
			l = new node(s, m);
			r = new node(m+1, e);
			dp=combine(l->dp, m, r->dp);
		}
		else{
			dp.resize(5, vector<int>(5, LLONG_MAX/100000));
			for (int i=0; i<k; ++i)dp[i][i]=0;
		}
	}
	vector<vector<int> > query(int left, int right){
		if (s==left && e==right)return dp;
		if (right<=m)return l->query(left, right);
		else if (left>m)return r->query(left, right);
		else return combine(l->query(left, m), m, r->query(m+1, right));
	}
}*st;

int32_t main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int m, q, a, b, c;
	cin>>k>>n>>m>>q;
	graph.resize(n);
	while (m--)cin>>a>>b>>c, graph[a].pb(mp(b, c));
	st = new node(0, (n-1)/k);
	while (q--){
		cin>>a>>b;
		int res=st->query(a/k, b/k)[a%k][b%k];
		cout<<(res==LLONG_MAX/100000?-1:res)<<"\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...