思路:
采用并查集对数据进行隐藏。
代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<cstdlib>
typedef long long ll;
using namespace std;
map<int,int>f;//由于n很大,所以数组无法满足要求
//(这种越界的情况一般显示段错误,或者是程序运行错误)用map
int father(int x)
{
if(!f.count(x))
return x;
else
return f[x]=father(f[x]);
}
void hide(int x)
{
int v=father(x+1);
f[x]=v;
}
int main()
{
// ios::sync_with_stdio(false);//采用cin,cout会超时
int n,m;
scanf("%d%d",&n,&m);
// for(i=1;i<=n;i++)
// {
// f[i]=i;
// }//这种方法是O(n)的,所以超时;而用count是log(n).(自己的理解)
while(m--)
{
int q,x;
scanf("%d%d",&q,&x);
if(q==1)
{
hide(x);
}
if(q==2)
{
if(!f.count(x))
printf("%d\n",x);
else
printf("%d\n",father(x));//这里应注意不是找到f[x],而是找到x的父亲.
//举例说明:5 3 1 2 1 3 2 2
}
}
return 0;
}