제출 #143928

#제출 시각아이디문제언어결과실행 시간메모리
143928WhipppedCreamJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
810 ms74548 KiB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
using namespace std;
#define X first
#define Y second
#define pb push_back
typedef pair<int, int> ii;
typedef long long ll;
 
const int maxn = 3e4+5;
const int half = 173;
 
int n, m;
int dist[maxn*180*2];

vector< ii > adj[maxn];
 
bool ok(int x)
{
	return 0<= x && x< n;
}

int N;

priority_queue< pair<int, int> > q;

int conv(int u, int md, int isleft)
{
	if(isleft) return (half+1)*n+(md-1)*n+u;
	return md*n+u;
}

void bfs(int s)
{
	for(int i = 0; i< N; i++) dist[i] = 1e9;
	dist[s] = 0; q.push({0, s});
	while(!q.empty())
	{
		auto kk = q.top(); q.pop();
		int u = kk.Y, d = -kk.X;
		// printf("%d\n", u);
		if(d> dist[u]) continue;
		if(u< n)
		{
			for(auto k2 : adj[u])
			{
				int v = k2.X, w = k2.Y;
				if(dist[v]> dist[u]+w)
				{
					dist[v] = dist[u]+w;
					q.push({-dist[v], v});
				}
			}
		}
		if(u>= n)
		{
			bool isleft = false;
			int tmp;
			if(u< (half+1)*n)
			{		
				isleft = false;
				tmp = u-n;
			}
			else
			{
				isleft = true;
				tmp = u-(half+1)*n;
			}
			int md = tmp/n+1;
			int sub = tmp%n;
			// assert(conv(sub, md, isleft) == u);
			if(isleft && ok(sub-md))
			{
				int nxt = conv(sub-md, md, isleft);
				if(dist[nxt]> dist[u]+1)
				{
					dist[nxt] = dist[u]+1;
					q.push({-dist[nxt], nxt});
				}
				if(dist[sub-md]> dist[u]+1)
				{
					dist[sub-md] = dist[u]+1;
					q.push({-dist[sub-md], sub-md});
				}
			}
			if(!isleft && ok(sub+md))
			{
				int nxt = conv(sub+md, md, isleft);
				if(dist[nxt]> dist[u]+1)
				{
					dist[nxt] = dist[u]+1;
					q.push({-dist[nxt], nxt});
				}
				if(dist[sub+md]> dist[u]+1)
				{
					dist[sub+md] = dist[u]+1;
					q.push({-dist[sub+md], sub+md});
				}
			}
		}
	}
}
 
int hom[maxn], mana[maxn];
 
int main()
{
	scanf("%d %d", &n, &m);
	N = conv(n-1, half, 1);
	for(int i = 0; i< m; i++)
	{
		scanf("%d %d", &hom[i], &mana[i]);
	}
	// printf("okay\n");
	for(int i = 0; i< m; i++)
	{
		int pw = mana[i];
		if(pw> half)
		{
			int cur = hom[i]+pw;
			while(cur< n)
			{
				adj[hom[i]].pb({cur, abs(cur-hom[i])/pw});
				cur += pw;
			}
			cur = hom[i]-pw;
			while(cur>= 0)
			{
				adj[hom[i]].pb({cur, abs(cur-hom[i])/pw});
				cur -= pw;
			}
		}
		else
		{
			int x = hom[i];
			adj[x].pb({conv(x, pw, 0), 0});
			adj[x].pb({conv(x, pw, 1), 0});
		}
	}
	bfs(hom[0]);
	if(dist[hom[1]] == 1e9) printf("-1\n");
	else printf("%d\n", dist[hom[1]]);
}

컴파일 시 표준 에러 (stderr) 메시지

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:109:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
skyscraper.cpp:113:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &hom[i], &mana[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...