题意:n个数字,1-n。q次操作,每次有两种类型。要么是标记index位置的数字为不可用,要么是查询index位置数字后(包括自身)最近的一个可用数字。
最开始感觉是线段树……但是不知道怎么表示节点属性。之后就考虑结构体,或者set,vector,通过erase来搞。但是这样在查询的时候还是得O(n)从头到尾找。
后来dl说是unordered_map,最开始没搞明白为什么要用map。其实这里用map是因为unordered_map底层实现是通过哈希表,所以查询效率会很高。我们用map只是为了它高效的查询。键值对的第二个位置可有可无……
不过按说后来不断++的寻找应该会T,可能数据比较弱就水过去了……
#include <bits/stdc++.h>
using namespace std;
int n, q, type, ind, ans;
int main()
{
unordered_map<int, bool> numset;
scanf("%d %d", &n, &q);
while(q--)
{
scanf("%d %d", &type, &ind);
if(type == 1)//标记不可用
{
numset.insert({ind, 1});//用numset来放不可以用的
//(numset.find(ind))->second = 0;
}
else//type = 2查询
{
//if(numset.find(ind)->second == 1)
if(numset.find(ind) == numset.end())
printf("%d\n", ind);
else
{
while(1)
{
//if((numset.find(ind))->second == 1)
if(numset.find(ind) == numset.end())
{
printf("%d\n", ind);
break;
}
ind++;
}
}
}
}
return 0;
}