제출 #408728

#제출 시각아이디문제언어결과실행 시간메모리
408728atoizRestore Array (RMI19_restore)C++14
100 / 100
439 ms912 KiB
/*input
8 3
0 2 3 0
3 4 1 1
5 7 2 0
4 5
0 1 2 1
0 2 2 0
2 2 1 0
0 1 1 0
1 2 1 0
*/
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	struct edge_t {
		int u, v, c;
		edge_t(int _u, int _v, int _c): u(_u), v(_v), c(_c) {};
	};
	vector<edge_t> edges;
	while (m--) {
		int l, r, k, x;
		cin >> l >> r >> k >> x;
		++r;
		if (x == 0) edges.emplace_back(l, r, r - l - k);
		else edges.emplace_back(r, l, k - 1 - r + l);
	}
	for (int i = 0; i < n; ++i) edges.emplace_back(i, i + 1, 1);
	for (int i = 0; i < n; ++i) edges.emplace_back(i + 1, i, 0);

	vector<int> min_dist(n + 1, n + 2);
	min_dist[0] = 0;
	bool unfinished = true;
	for (int i = 0; i <= n + 2 && unfinished; ++i) {
		unfinished = false;
		for (auto &e : edges) {
			if (min_dist[e.u] + e.c < min_dist[e.v]) {
				min_dist[e.v] = min_dist[e.u] + e.c;
				unfinished = true;
			}
		}
	}

	if (unfinished) {
		cout << -1 << endl;
	} else {
		for (int i = 0; i < n; ++i) {
			cout << min_dist[i + 1] - min_dist[i] << ' ';
		}
		cout << endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...