답안 #1114100

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1114100 2024-11-18T07:49:29 Z raspy Jakarta Skyscrapers (APIO15_skyscraper) C++17
0 / 100
1000 ms 50560 KB
#include <bits/stdc++.h>

#define int long long
#define vi vector<int>
#define ii pair<int, int>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define P 31
#define mod 1'000'000'007
#define inf 1'000'000'000'000
#define pb push_back
#define str string
#define sz(x) (x).size()
#define vvi vector<vi>
#define fun function
#define oopt cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
#define file freopen("problemname.in", "r", stdin); freopen("pr.out", "w", stdout);
#define dbg(v) cout << "Line(" << __LINE__ << ") -> " << #v << " = " << (v) << endl;

using namespace std;
template <class T, int SZ> using arr = array<T, SZ>;

int b[30001];
int power[30001];
set<int> pravi[30001];
set<ii> graf[30001];
int ob[30001];
int obp[201][30001];

void solve()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < 30001; i++)
	{
		ob[i] = inf;
		for (int j = 0; j < 201; j++)
			obp[j][i] = inf;
	}
	for (int i = 0; i < m; i++)
	{
		cin >> b[i] >> power[i];
		if (power[i] > 200)
		{
			for (int j = 1; j*j <= n; j++)
			{
				if (b[i]+power[i]*j < n)
					graf[b[i]].insert({b[i]+power[i]*j, j});
				if (b[i]-power[i]*j >= 0)
					graf[b[i]].insert({b[i]-power[i]*j, j});
			}
		}
		else
			pravi[b[i]].insert(power[i]);
	}
	priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> pq;
	if (power[0] > 200)
	{
		pq.push({0, b[0], inf});
		ob[b[0]] = 0;
	}
	else
	{
		pq.push({0, b[0], power[0]});
		obp[b[0]][power[0]] = 0;
	}
	while (pq.size())
	{
		auto [d, pos, pow] = pq.top();
		pq.pop();
		if (pos == b[1])
		{
			cout << d << "\n";
			return;
		}
		if (pow > 200)
		{
			if (ob[pos] < d) continue;
			for (auto [p, w] : graf[pos])
			{
				if (ob[p] > d+w)
				{
					ob[p] = d+w;
					pq.push({d+w, p, pow});
				}
			}
			for (int p : pravi[pos])
			{
				obp[pos][p] = d;
				pq.push({d, pos, p});
			}
		}
		else
		{
			if (obp[pow][pos] < d) continue;
			if (pos-pow >= 0 && obp[pow][pos-pow] > d+1)
			{
				obp[pow][pos-pow] = d+1;
				pq.push({d+1, pos-pow, pow});
			}
			if (pos+pow < n && obp[pow][pos+pow] > d+1)
			{
				obp[pow][pos+pow] = d+1;
				pq.push({d+1, pos+pow, pow});
			}
			if (ob[pos] == 0)
			{
				ob[pos] = d;
				pq.push({d, pos, inf});
			}
			for (int p : pravi[pos])
			{
				obp[pos][p] = d;
				pq.push({d, pos, p});
			}
		}
	}
	cout << -1 << "\n";
}

signed main()
{
	// oopt;
	int t = 1;
	// cin >> t;
	while (t--)
		solve();
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1072 ms 50512 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1070 ms 50512 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1071 ms 50504 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1064 ms 50512 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1044 ms 50560 KB Time limit exceeded
2 Halted 0 ms 0 KB -