这道题就是纯模拟,直接按照他给的方法模拟即可。
注意如果直接使用循环模拟的话会有可能爆时。。。(王三岁不会告诉你我是怎么知道的。)
直接附上召唤王三岁的代码:(后有总结)
#include<stdio.h>
#include<string.h>
struct node{
int right,left;
char c[30];
node()
{
right=left=0;
}
}tree[100001];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int flag=0;
scanf("%d ",&flag);
scanf("%s",&tree[i].c);
if(flag==0)
{
tree[i].right=1;
tree[i].left=-1;
}
else
{
tree[i].right=-1;
tree[i].left=1;
}
}
int flag=1;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
y=y%n;
if(x==0)//goto left
{
if(tree[flag].left==1)
{
flag=flag+y;
if(flag>n)
{
flag-=n;
}
}
else
{
if(y>=flag)
{
y=y-flag;
flag=n-y;
}
else
{
flag-=y;
}
}
}
else//goto right
{
if(tree[flag].right==1)
{
flag=flag+y;
if(flag>n)
{
flag-=n;
}
}
else
{
if(y>=flag)
{
y=y-flag;
flag=n-y;
}
else
{
flag-=y;
}
}
}
}
printf("%s",tree[flag].c);
}
大概就是如此了。
最好还是注意一下数组开的问题。
(很想爆粗口因为第二题80%的LCA都写出来了结果第一题在这里丢分。果然应该更加谨慎才好。)
附加上一些总结:
1.数组的大小一定要看好不要开小了,如果需要的数组太大了的话可以考虑优化。
2.从今年的情况看,内存有所增大,可以开大就开大,不要犹豫,小了崩盘很划不来
3.减少用循环!减少用循环!减少用循环orz!(死在循环下,并不太风流啊西吧)
王三岁的惨痛(zuo si)经验告诉大家,慎用循环。