Submission #698335

#TimeUsernameProblemLanguageResultExecution timeMemory
698335jk410Jakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
119 ms76612 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx2")
#define all(v) v.begin(),v.end()
#define compress(v) v.erase(unique(all(v)),v.end())
using namespace std;
const int INF = (int)1e9;
struct edge {
	int v, cost;
	bool operator<(const edge& tmp)const {
		return cost > tmp.cost;
	}
};
int N,M,SQRT;
int B[30000];
vector<int> P[30000];
bool Used[30000][173];
vector<edge> Edge[30000];
int Dist[30000];
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M;
	SQRT = (int)sqrt(N);
	for (int i = 0; i < M; i++) {
		int p;
		cin >> B[i] >> p;
		if (p < SQRT)
			P[B[i]].push_back(p);
		else {
			for (int j = 1; B[i] - j * p >= 0; j++)
				Edge[B[i]].push_back({ B[i] - j * p,j });
			for (int j = 1; B[i] + j * p < N; j++)
				Edge[B[i]].push_back({ B[i] + j * p,j });
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j : P[i]) {
			for (int k = 1; i - k * j >= 0; k++) {
				Edge[i].push_back({ i - k * j,k });
				if (Used[i - k * j][j])
					break;
				Used[i - k * j][j] = true;
			}
		}
	}
	for (int i = N - 1; i >= 0; i--) {
		fill(Used[i], Used[i] + SQRT, false);
		for (int j : P[i]) {
			for (int k = 1; i + k * j < N; k++) {
				Edge[i].push_back({ i + k * j,k });
				if (Used[i + k * j][j])
					break;
				Used[i + k * j][j] = true;
			}
		}
	}
	priority_queue<edge> q;
	fill(Dist, Dist + N, INF);
	Dist[B[0]] = 0;
	q.push({ B[0],0});
	while (!q.empty()) {
		auto t = q.top();
		q.pop();
		if (Dist[t.v] < t.cost)
			continue;
		for (edge i : Edge[t.v]) {
			if (Dist[i.v] > t.cost + i.cost) {
				Dist[i.v] = t.cost + i.cost;
				q.push({ i.v,Dist[i.v] });
			}
		}
	}
	int ans = Dist[B[1]];
	if (ans == INF)
		ans = -1;
	cout << ans;
	return 0;
}
#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...