Submission #453279

#TimeUsernameProblemLanguageResultExecution timeMemory
453279nonsensenonsense1Jakarta Skyscrapers (APIO15_skyscraper)C++17
36 / 100
465 ms262148 KiB
#include <cstdio>
#include <vector>
#include <deque>

struct node {
	int pos, dist;
	node *left, *right;
	bool vis;
	node(int pos_ = -1) {
		pos = pos_;
		left = right = 0;
		vis = false;
		dist = ~(1 << 31);
	}
};

const int N = 30000;
const int K = 180;
int n, m;
node g[K][N];
std::vector<node *> top[N];
std::deque<node *> dq;

void go(node *cur, node *to, bool w) 
{
	if (to->dist > cur->dist + w) {
		to->dist = cur->dist;
		if (w) {
			++to->dist;
			dq.push_back(to);
		}
		else dq.push_front(to);
	}
}

int main() 
{
	scanf("%d%d", &n, &m);
	for (int i = 0; i < K; ++i) {
		for (int j = 0; j < N; ++j) {
			g[i][j].pos = j;
			if (i) {
				if (j >= i) g[i][j].left = g[i] + j - i;
				if (j + i < N) g[i][j].right = g[i] + j + i;
			}
		}
	}
	int s, t;
	for (int i = 0; i < m; ++i) {
		int b, p;
		scanf("%d%d", &b, &p);
		if (!i) s = b;
		if (i == 1) t = b;
		if (p < K) top[b].push_back(g[p] + b);
		else {
			node *r = new node(b);
			top[b].push_back(r);
			node *prev = r;
			for (int j = b - p; j >= 0; j -= p) {
				node *cur = new node(j);
				cur->right = prev;
				prev->left = cur;
				prev = cur;
			}
			prev = r;
			for (int j = b + p; j < N; j += p) {
				node *cur = new node(j);
				cur->left = prev;
				prev->right = cur;
				prev = cur;
			}
		}
	}
	g[0][s].dist = 0;
	dq.push_back(g[0] + s);
	while (!dq.empty()) {
		node *cur = dq.front();
		dq.pop_front();
		if (!cur->vis) {
			cur->vis = true;
			if (cur >= g[0] && cur < g[1]) for (int i = 0; i < (int)top[cur->pos].size(); ++i) go(cur, top[cur->pos][i], 0);
			else {
				go(cur, g[0] + cur->pos, 0);
				if (cur->left) go(cur, cur->left, 1);
				if (cur->right) go(cur, cur->right, 1);
			}
		}
	}
	if (g[0][t].dist == ~(1 << 31)) printf("-1\n");
	else printf("%d\n", g[0][t].dist);
	return 0;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:38:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |  scanf("%d%d", &n, &m);
      |  ~~~~~^~~~~~~~~~~~~~~~
skyscraper.cpp:51:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |   scanf("%d%d", &b, &p);
      |   ~~~~~^~~~~~~~~~~~~~~~
skyscraper.cpp:89:14: warning: 't' may be used uninitialized in this function [-Wmaybe-uninitialized]
   89 |  if (g[0][t].dist == ~(1 << 31)) printf("-1\n");
      |      ~~~~~~~~^~~~
skyscraper.cpp:75:22: warning: 's' may be used uninitialized in this function [-Wmaybe-uninitialized]
   75 |  dq.push_back(g[0] + s);
      |                      ^
#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...