思路
首先考虑到纯模拟,暴力。交上去发现TLE。
然后这题有个坑点,就是有可能反复横跳,死循环。这样的话,就要判断一下死循环的情况。设定一个最大步数,超过就是死循环。如果某一个点重复经过
3
n
3n
3n 次就一定是死循环了。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,s,x[N],y[N],k=1,num,vis[N],f=1,h,v[N];
int main()
{
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
while(s>=1 and s<=n)
{
if(h>=3*n or v[s]>=3*n)break;
if(vis[s]==0)h++;
if(x[s]==1 and k>=y[s] and vis[s]==0)
{
num++;
vis[s]=1;
}
if(x[s]==0)
{
f*=-1;
k+=y[s];
vis[s]=1;
}
v[s]++;
s+=(k*f);
}
printf("%d",num);
return 0;
}