RT
在LOJ和UOJ上测都过了,还跑得飞快。
在你谷评测不开O2就会在#13T掉。
这个可能是什么原因啊,求解答/kel
Code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <tuple>
#define Rint register int
#define INF 0x3f3f3f3f
using namespace std;
typedef long long lxl;
const int maxn=3e4+5;
template <typename T>
inline void read(T &x)
{
x=0;T f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
x*=f;
}
int n,m;
vector<int> vec[maxn];
queue<tuple<int,int,int> > q;
bitset<maxn> vis_doge[maxn],vis_city;
inline void insert(int b,int p,int step)
{
if(!vis_city.test(b))
{
vis_city.set(b);
for(auto x:vec[b])
{
vis_doge[b].set(x);
q.push(make_tuple(b,x,step));
}
}
if(!vis_doge[b].test(p))
{
vis_doge[b].set(p);
q.push(make_tuple(b,p,step));
}
}
int main()
{
// freopen("P3645.in","r",stdin);
read(n),read(m);
int s,t;
for(int i=0,b,p;i<m;++i)
{
read(b),read(p);
vec[b].push_back(p);
if(i==0) s=b;
if(i==1) t=b;
}
for(auto x:vec[s])
insert(s,x,0);
while(!q.empty())
{
int b,p,step;
tie(b,p,step)=q.front();q.pop();
if(b==t) return printf("%d\n",step),0;
if(b-p>=0) insert(b-p,p,step+1);
if(b+p<n) insert(b+p,p,step+1);
}
puts("-1");
return 0;
}