Submission #531148

#TimeUsernameProblemLanguageResultExecution timeMemory
531148HanksburgerJakarta Skyscrapers (APIO15_skyscraper)C++17
57 / 100
1094 ms242736 KiB
#include <bits/stdc++.h>
using namespace std;
int deq[21000005], edge[21000005], nxt[21000005], lnk[10500005], dist[10500005], a[30005][175], n, m, s, t, sz, cnt, l=10500000, r=10500000;
void add(int u, int v, int w)
{
	cnt++;
	edge[cnt]=v*2+w;
	nxt[cnt]=lnk[u];
	lnk[u]=cnt;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	sz=n;
	for (int i=0; i<m; i++)
	{
		int b, p;
		cin >> b >> p;
		if (i==0)
			s=b;
		else if (i==1)
			t=b;
		if (p*p<=m)
		{
			if (!a[b][p])
			{
				a[b%p][p]=sz;
				sz++;
				add(a[b%p][p], b%p, 0);
				for (int j=b%p+p; j<n; j+=p)
				{
					a[j][p]=sz;
					sz++;
					add(a[j][p], j, 0);
					add(a[j][p], a[j-p][p], 1);
					add(a[j-p][p], a[j][p], 1);
				}
			}
			add(b, a[b][p], 0);
		}
		else
		{
			int prev=b;
			for (int j=b-p; j>=0; j-=p)
			{
				add(prev, sz, 1);
				add(sz, j, 0);
				prev=sz;
				sz++;
			}
			prev=b;
			for (int j=b+p; j<n; j+=p)
			{
				add(prev, sz, 1);
				add(sz, j, 0);
				prev=sz;
				sz++;
			}
		}
	}
	for (int i=0; i<sz; i++)
		dist[i]=1e9;
	dist[s]=0;
	deq[10500000]=s;
	while (l<=r)
	{
		int u=deq[l], cur;
		l++;
		cur=lnk[u];
		while (cur)
		{
			int v=edge[cur]>>1, w=edge[cur]&1;
			if (dist[v]==1e9)
			{
				dist[v]=dist[u]+w;
				if (w)
				{
					r++;
					deq[r]=v;
				}
				else
				{
					l--;
					deq[l]=v;
				}
			}
			cur=nxt[cur];
		}
	}
	if (dist[t]==1e9)
		cout << -1;
	else
		cout << dist[t];
	return 0;
}
#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...