警示??
查看原帖
警示??
377876
lbc20070331楼主2022/11/6 22:02

看题解区里基本上都是分类讨论:向右,向左;


但仔细想想,向右数不也能转化为向左数的吗? 只要将原来·的朝向·与·现在的数数方向·&一下就迎刃而解了~~


所以就是将所有的方向都转为向左数,在就处理圆形循环就OK了。


而圆形循环看来只能O(1)判断,那——推公式呗:如下-->令现在的位置为place,移动数为step,共有n个小人,那移动好的位置就为n-step+place.(仅限于step>=place时,ps. 我令初始位置为1)那step<place时,位置为place-step


#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
	int id;
	string name;
	int to;
};
node ns[200005];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>ns[i].to>>ns[i].name;
		ns[i].id=i;
	}
	int pl=1;
	for(int i=1;i<=m;i++){
		int turn,num;
		cin>>turn>>num;
		int dir=turn^ns[pl].to;
		if(dir==1) num=n-num;
		if(num>=pl) pl=n-num+pl;
		else pl-=num;
	}
	cout<<ns[pl].name<<"\n";
	return 0;
}

解决~~

2022/11/6 22:02
加载中...