官方题解
2026-03-24 23:42:09
发布于:浙江
10阅读
0回复
0点赞
题目大意
有一个 大小的数组,其实所有位置都为 ,有 次操作,每次操作会给出两个整数 和 ,如果 ,则从 的位置开始向右寻找第一个为 的位置,找到后将此位置的值设置为 ;如果 ,则输出数组 的值。
解题思路
首先, ,这是数组可以开到的大小,所以我们可以用数组 存储所有位置具体的数字。另外,还可以用 set 存储值为 的位置。
查询时,如果 ,则直接输出 即可;如果 ,则可以在 set 中通过二分 lower_bound 函数找到第一个大于等于 的位置,如果没找到,则再用二分找第一个大于等于 的位置。
参考代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 200010;
int main(){
vector<ll>a(1<<20,-1);
set<ll>s;
for(int i=0;i<(1<<20);i++) s.insert(i);
int q;cin>>q;
while(q--){
ll op,x;cin>>op>>x;
ll y=x%(1<<20);
if(op==2) cout<<a[y]<<endl;
else{
auto pos=s.lower_bound(y);
if(pos==s.end()){
pos=s.lower_bound(0);
}
ll num=*pos;
a[num]=x;
s.erase(pos);
}
}
return 0;
}
这里空空如也








有帮助,赞一个