Submission #23047

#TimeUsernameProblemLanguageResultExecution timeMemory
23047BruteforcemanJakarta Skyscrapers (APIO15_skyscraper)C++11
100 / 100
536 ms26680 KiB
#include <bits/stdc++.h>
using namespace std;
vector <int> g[30010];
const int magic = 173;
int n;

int table[180][30010];

int p[30010];
int b[30010];

class vertex {
public:
	int position;
	int power;
	vertex (int position, int power) : position (position), power (power) {}
	vertex (int position) : position (position) {
		power = 0;
	}
	vertex () {} 
	int distance() {
		return table[power][position];
	}
	void updateDist(int dist) {
		table[power][position] = min(table[power][position], dist);
	}
	bool good(int dist) {
		if(0 > position or position >= n) return false;
		if(this -> distance() <= dist) return false;
		else {
			this -> updateDist(dist);
			return true;
		}
	}
	void out() {
		cerr << position;
		if(power != 0) cerr << " " << power;
		cerr << endl;
	}
};

class event {
public: 
	vertex v;
	int dist;
	event () {}
	event (vertex v, int dist) : v(v), dist(dist) {}
	bool operator < (event e) const {
		return dist > e.dist;
	}
};

void shortest_path() {
	const int inf = table[0][0];
	
	priority_queue <event> Q;
	
	table[0][b[0]] = 0;
	Q.push(event(vertex(b[0]), 0));

	while(not Q.empty()) {
		event e = Q.top();
		Q.pop();
		// e.v.out();

		int dist = e.dist;
		vertex v = e.v;
		int cost;
		vertex u;

		if(v.power == 0) {
			for(int i : g[v.position]) {
				if(i <= magic) {
					cost = 1;

					u = vertex (v.position + i, i);
					if(u.good(cost + dist)) Q.push(event(u, cost + dist));

					u = vertex (v.position - i, i);
					if(u.good(cost + dist)) Q.push(event(u, cost + dist));

				} else {

					cost = 0;
					for(int pos = v.position + i; pos < n; pos += i) {
						u = vertex (pos);
						cost += 1;
						if(u.good(dist + cost)) Q.push(event(u, dist + cost));
					}

					cost = 0;
					for(int pos = v.position - i; pos >= 0; pos -= i) {
						u = vertex (pos);
						cost += 1;
						if(u.good(dist + cost)) Q.push(event(u, dist + cost));
					}
				}
			}
		} else {
			cost = 1;
			u = vertex (v.position + v.power, v.power);
			if(u.good(cost + dist)) Q.push(event(u, cost + dist));

			u = vertex (v.position - v.power, v.power);
			if(u.good(cost + dist)) Q.push(event(u, cost + dist));

			u = vertex (v.position);
			if(u.good(dist)) Q.push(event(u, dist));
		}
	}
	int ans = table[0][b[1]];
	ans = (ans == inf) ? -1 : ans;
	printf("%d\n", ans);
}

int main(int argc, char const *argv[])
{
	memset(table, 63, sizeof table);
	int m;
	scanf("%d %d", &n, &m);
	for(int i = 0; i < m; i++) {
		scanf("%d %d", b + i, p + i);
		g[b[i]].push_back(p[i]);
	}
	shortest_path ();
	return 0;
}

Compilation message (stderr)

skyscraper.cpp: In function 'int main(int, const char**)':
skyscraper.cpp:120:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
                        ^
skyscraper.cpp:122:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", b + i, p + 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...