Submission #145163

#TimeUsernameProblemLanguageResultExecution timeMemory
145163tincamateiToll (BOI17_toll)C++14
100 / 100
134 ms28144 KiB
#include <bits/stdc++.h>

using namespace std;

const int INF = 500000001;
const int MAX_N = 50000;

struct Matrix {
	int matr[5][5];

	Matrix() {
		for(int i = 0; i < 5; ++i)
			for(int j = 0; j < 5; ++j)
				matr[i][j] = INF;
	}
};

Matrix mergeMatrices(int k, Matrix a, Matrix b) {
	Matrix rez;
	for(int i = 0; i < k; ++i)
		for(int j = 0; j < k; ++j)
			for(int l = 0; l < k; ++l)
				rez.matr[i][j] = min(rez.matr[i][j], a.matr[i][l] + b.matr[l][j]);
	return rez;
}

Matrix aint[1+4*MAX_N];
Matrix tranz[MAX_N];

void init(int K, int nod = 1, int l = 0, int r = MAX_N - 1) {
	if(l < r) {
		int mid = (l + r) / 2;
		init(K, 2 * nod, l, mid);
		init(K, 2 * nod + 1, mid + 1, r);
		aint[nod] = mergeMatrices(K, aint[2 * nod], aint[2 * nod + 1]);
	} else {
		aint[nod] = tranz[l];
	}
}

Matrix query(int K, int i, int j, int l = 0, int r = MAX_N - 1, int nod = 1) {
	if(i <= l && r <= j) {
		return aint[nod];
	} else {
		int mid = (l + r) / 2;
		Matrix rez;
		if(i <= mid) {
			rez = query(K, i, j, l, mid, 2 * nod);
			if(j > mid)
				rez = mergeMatrices(K, rez, query(K, i, j, mid + 1, r, 2 * nod + 1));
		} else
			rez = query(K, i, j, mid + 1, r, 2 * nod + 1);
		return rez;
	}
}

int main() {
	int K, N, M, O;

	scanf("%d%d%d%d", &K, &N, &M, &O);
	for(int i = 0; i < M; ++i) {
		int a, b, t;
		scanf("%d%d%d", &a, &b, &t);
		tranz[a / K].matr[a % K][b % K] = min(tranz[a / K].matr[a % K][b % K], t);
	}

	init(K);

	for(int i = 0; i < O; ++i) {
		int a, b;
		scanf("%d%d", &a, &b);
		if(a / K >= b / K)
			printf("-1\n");
		else {
			Matrix rez = query(K, a / K, b / K - 1);
			if(rez.matr[a % K][b % K] >= INF)
				printf("-1\n");
			else
				printf("%d\n", rez.matr[a % K][b % K]);
		}
	}

	return 0;
}

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:60:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d", &K, &N, &M, &O);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:63:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", &a, &b, &t);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
toll.cpp:71:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
#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...