题目大意:每次你可以使一个数失效,或者询问大于该数的第一个有效数是哪个数字。
题目思路:考虑并查集,由于n与x太大,所以用map的并查集,undorered map不会超时 否则普通map会t
ac:
#include<bits/stdc++.h>
#define ll long long
#include <stdio.h>
#include <algorithm>
#pragma GCC optimize(2)
using namespace std;
const int maxn=1e6+1000;
const ll INF=10000000000;
inline ll read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll n,m;
unordered_map<int,int>mp;
int Find(int y)
{
if(!mp.count(y)) return y;
return mp[y]=Find(mp[y]);
}
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
if(x==1)
{
if(!mp.count(y)) mp[y]=y+1;
else mp[y]=mp[y+1];
}
else
printf("%d\n",Find(y));
}
return 0;
}
总结:
1.undoreredmap比map速度要快
2.判断一个数是否在map中可以用 mp.count 比 if(mp[x]) 明显要快