日常训练2025-1-18
D1. Turtle and a MEX Problem (Easy Version)
rating:1500
https://codeforces.com/problemset/problem/2003/D1
思路(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;
}