题意
初始一个空集合,给定q次操作
有2种类型
+ x,表示往集合添加数x
? x,表示查询集合中x-mex的元素,x-mex表示第一个能被x整除,且不在集合中的元素。
1<=a<=200000
1<=x<=1e18
思路
暴力,记录下每次查询时,不同x的最小倍数。
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pcc pair<char, char>
#define pii pair<int, int>
#define inf 0x3f3f3f3f
const int maxn = 200010;
const int mod = 998244353;
int q;
ll x;
char op;
set<ll> st;
map<ll, ll> mp;
void solve() {
cin >> q;
st.clear();
mp.clear();
int cas = 1;
while (q--) {
cin >> op >> x;
// cout << "case" << cas++ << ":" << endl;
if (op == '+') {
st.insert(x);
continue;
}
ll cur = mp[x];
if (!cur) {
cur = 1;
}
while (st.find(cur * x) != st.end()) {
++cur;
}
cout << cur * x << endl;
mp[x] = cur;
}
}
int main() {
int t = 1;
// scanf("%d", &t);
int cas = 1;
while (t--) {
// printf("cas %d:\n", cas++);
solve();
}
}