题目分析:模拟。(提到模拟,无论从简单到难,都有一个永远不变的问题,那就是一定要分析清楚过程,这种类型的题目是最能反映一句名言的:细节决定成败。)
我们来看看注意的细节:
1、既然是模拟,模拟是以时间(step)为线索的,那么我们开一个step数组记录每一步的监视情况可以吗?显然不行:(1 ≤ ti ≤ 109)。由题目中t的输入一定是从小到大的,我们只要开一个m大小的结构体就够了,当然t是一定要被记录的。
2、既然采用上面对step的记录方式,那么就会在处理中引起一些小问题:当前步骤不是结构体数组的步骤,那么我们不能把这组数据丢掉,我们直接向这目标前进,i--就行了。
3、当0~m的数组跑完了,监视没有了,但是我们的note还没有传递到目标间谍的手上,这时候我们要继续传递。
AC代码:
#include<cstdio>
#include<cstring>
struct node
{
int id,l,r;
}a[100005];
int main()
{
int n,m,s,f;
while(scanf("%d %d %d %d",&n,&m,&s,&f)!=EOF)
{
memset(a,0,sizeof a);
for(int i=0;i<m;i++)
scanf("%d %d %d",&a[i].id,&a[i].l,&a[i].r);
int t=1,note=s;
for(int i=0;i<m;i++)
{
if(note==f)
break;
if(a[i].id!=t)
{
if(s<f)
{
printf("R");
note++;
}
else if(s>=f)
{
printf("L");
note--;
}
i--;
}
else if(s<f && (a[i].l>note+1 || a[i].r<note))
{
printf("R");
note++;
}
else if(s>=f && (a[i].l>note || a[i].r<note-1))
{
printf("L");
note--;
}
else
printf("X");
t++;
}
while(note!=f) ///监视完了,任务还没有完。
{
if(s<f)
{
printf("R");
note++;
}
else if(s>=f)
{
printf("L");
note--;
}
}
puts("");
}
return 0;
}