不开 O2 过不了怎么办呜呜呜
查看原帖
不开 O2 过不了怎么办呜呜呜
78216
墨笙_Mooos楼主2021/7/16 11:19

https://www.luogu.com.cn/record/53276456

#include<iostream>
#include<bitset>
#include<vector>
#include<tuple>
#include<queue>
#define endl '\n'
#define QAQ(m, n) for(int i = m;i <= n;++i)
#define QWQ(m, n) for(int j = m;j <= n;++j)
namespace IO{/*这里是快读板子*/}using namespace IO;
int n, m, s, t, b, p;
std::vector<int> Doges[30010];
std::bitset<30010> vis[30010];
std::queue<std::tuple<int, int, int> > q;
bool V[30010];
inline void Add (int pos, int p, int step)
{
	if (pos == t) println (step), exit (0);
	if (!V[pos])
	{
		V[pos] = true;
		for (auto Doge : Doges[pos])
			if (!vis[pos].test (Doge))
				vis[pos].set (Doge), q.emplace (pos, Doge, step);
	}
	if (!vis[pos].test (p)) vis[pos].set (p), q.emplace (pos, p, step);
}

int main ()
{
	std::cin.tie (0), std::ios::sync_with_stdio (false);
	read (n), read (m);
	QAQ (0, m - 1)
	{
		read (b), read (p), Doges[b].push_back (p);
		if (!i) s = b;
		if (i == 1) t = b;
	}
	if (s == t) println (0), exit (0);
	V[s] = true;
	for (int Doge : Doges[s]) if (!vis[s].test (Doge)) vis[s].set (Doge), q.emplace (s, Doge, 0);
	while (!q.empty ())
	{
		int now, p, step;
		std::tie (now, p, step) = q.front (), q.pop ();
		if (now - p >= 0) Add (now - p, p, step + 1);
		if (now + p < n) Add (now + p, p, step + 1);
	}
	println (-1);
	return 0;
}

有无大佬帮我卡常呜呜呜

2021/7/16 11:19
加载中...