题意:有n个杯子分布在x正方向上,第i个杯子的坐标为(i,0)。 已知有m个点,当杯子中的骨头正好在这些点的时候就结束。共执行 k次 操作,每次操作讲i,j两个杯子内的内容互换~~~~问最后骨头会在哪个坐标下落(起初在杯子1中,即(1,0))。
思路:模拟啊模拟
复杂度分析:O(n) 级别
错误思路: 一直以为是从第一个杯子开始移动,然后再移动。还是题意没读懂,然后一直wa,一直找不出错点。实在没办法去codeforce上看了数据才知道。原来错在这了。 教训啊,题意一定要仔细看。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+60;
bool vis[maxn];
struct node
{
int st,ed;
}p[maxn];
int main(void)
{
memset(vis,false,sizeof(vis));
int n,m,k;
cin >> n>> m>> k;
for(int i=1;i<=m;i++)
{
int t;
scanf("%d",&t);
vis[t]=true;
}
ll ans=1;
for(int i=1;i<=k;i++)
{
scanf("%d%d",&p[i].st,&p[i].ed);
}
if(vis[1]==true)
{
printf("1\n");
return 0;
}
for(int i=1;i<=k;i++)
{
int st=p[i].st,ed=p[i].ed;
if(st==ans)// 如果骨头ans在st。
{
if(vis[ed]==true)
{
printf("%d\n",ed);
return 0;
}
else
ans=ed;
}
else if(ed==ans)//如果骨头ans在ed
{
if(vis[st]==true)
{
printf("%d\n",st);
return 0;
}
else
ans=st;
}
}
cout << ans << endl;
}