Submission #35171

#TimeUsernameProblemLanguageResultExecution timeMemory
35171cheater2kJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
929 ms124940 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 30005;
const int inf = 1e9;

int n, m;
int b[N], p[N];
vector<int> G[N], a[N];
vector< pair<int,int> > imp;
int *f[N];
int pt[N], *le[N], *ri[N];

int pos(int val, int d) {
	int it = lower_bound(G[d].begin(), G[d].end(), val) - G[d].begin();
	assert(G[d][it] == val);
	return it;
} 

int bfs() {
	for (int i = 1; i < N; ++i) {
		f[i] = new int[G[i].size()];
		for (int j = 0; j < G[i].size(); ++j) f[i][j] = inf;
	}

	deque < pair<int,int> > q;
	f[p[0]][pos(b[0], p[0])] = 0; 
	q.push_back(make_pair(p[0], pos(b[0], p[0])));
	
	while(!q.empty()) {
		int d = q.front().first, x = q.front().second; q.pop_front();
		int cur = f[d][x];
		int realX = G[d][x];
		if (realX == b[1]) return cur;

		if (le[d][x] > -1) {
			if (f[d][le[d][x]] == inf) f[d][le[d][x]] = cur + 1, q.push_back(make_pair(d, le[d][x]));
		}
		if (ri[d][x] < G[d].size()) {
			if (f[d][ri[d][x]] == inf) f[d][ri[d][x]] = cur + 1, q.push_back(make_pair(d, ri[d][x]));
		}
		while(!a[realX].empty()) {
			int new_d = a[realX].back(); a[realX].pop_back();
			int new_pos = pos(realX, new_d);
			if (f[new_d][new_pos] == inf) {
				f[new_d][new_pos] = cur;
				q.push_front(make_pair(new_d, new_pos));
			}
		}
	}

	return -1;
}

void reset(int d, int val) { for (int u : G[d]) pt[u % d] = val; }

int main() {
	ios_base::sync_with_stdio(false); cin.tie(0);
	cin >> n >> m;
	for (int i = 0; i < m; ++i) {
		cin >> b[i] >> p[i];
		imp.push_back(make_pair(p[i], b[i] % p[i]));
		a[b[i]].push_back(p[i]);
	}
	sort(imp.begin(), imp.end());
	imp.resize(distance(imp.begin(), unique(imp.begin(), imp.end())));

	for (auto &it : imp) {
		int d = it.first, mod = it.second;
		for (int i = mod; i < n; i += d) {
			G[d].push_back(i);
		}
	}

	for (int i = 1; i < N; ++i) {
		sort(G[i].begin(), G[i].end());
		le[i] = new int[G[i].size()];
		ri[i] = new int[G[i].size()];

		reset(i, -1);
		for (int j = 0; j < G[i].size(); ++j) {
			int cur = G[i][j]; le[i][j] = pt[cur % i]; pt[cur % i] = j;
		}

		reset(i, G[i].size());
		for (int j = G[i].size() - 1; j >= 0; --j) {
			int cur = G[i][j]; ri[i][j] = pt[cur % i]; pt[cur % i] = j;
		}
	}

	printf("%d\n", bfs());
}

Compilation message (stderr)

skyscraper.cpp: In function 'int bfs()':
skyscraper.cpp:23:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < G[i].size(); ++j) f[i][j] = inf;
                     ^
skyscraper.cpp:39:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (ri[d][x] < G[d].size()) {
                ^
skyscraper.cpp: In function 'int main()':
skyscraper.cpp:81:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int j = 0; j < G[i].size(); ++j) {
                     ^
#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...