日常训练2025-1-18
D1. Turtle and a MEX Problem (Easy Version)
rating:1500
思路(Trick)
每一个数组会有两个mex,第一个是没有意义的,因为做一次操作得到第一个mex后补到数组中就能得到更大的mex了,这样能让x更大,所以对于每个数组,我们只需要维护第二个mex。
然后我们发现,不需要维护每一个数组的第二个mex,因为如果有一个最大的mex存在,这个mex属于数组 b ,那么我们一定是去b数组做两次操作让x最大,所以其他数组的第二个mex就没有意义了。
最后做一个计数即可。
代码
#include <bits/stdc++.h>
typedef std::pair<long long, long long> pll;
typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;
void solve(){
int n, m;
std::cin >> n >> m;
std::vector<int> L(n);
std::vector a(n, std::set<int>());
for (int i = 0; i < n; i++){
int l; std::cin >> l;
L[i] = l;
for (int j = 0; j < l; j++){
int x; std::cin >> x;
a[i].insert(x);
}
}
int f1 = 0, f2 = 0;
for (int i = 0; i < n; i++){
int k = 1;
int j = 0;
while (true){
if (a[i].count(j)){
j++;
}else if (k == 1){
j++;
k--;
}else if (k == 0){
f2 = std::max(j, f2);
break;
}
}
}
// std::cerr<< f2 << '\n';
i64 ans = 0;
if (m < f2){
ans += f2*(m+1);
}else if (m == f2){
ans += 1LL * f2 * (f2+1);
}else{
ans += 1LL * f2 * (f2+1);
ans += 1LL * (m - f2) * (f2+1 + m) / 2;
}
std::cout << ans << '\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
int t = 1, i;
std::cin >> t;
for (i = 0; i < t; i++){
solve();
}
return 0;
}
标签:std,int,18,++,2025,日常,数组,mex
From: https://www.cnblogs.com/califeee/p/18678144