日常训练2025-1-18

日常训练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;
}

G1. Ruler (easy version)

rating:1500

https://codeforces.com/problemset/problem/1999/G1

思路(二分答案)

比较明显的一道二分答案法

代码

 #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(){
	auto ask = [&](int x, int y) ->int{
		std::cout << "? " << x << ' ' << y << std::endl;
		fflush(stdout);
		int ret; std::cin >> ret;
		return ret;
	};

	int l = 2, r = 999;
	while (l < r){
		int mid = (l + r) / 2;

		if (ask(1, mid) == mid + 1){
			r = mid;
		}else{
			l = mid + 1;
		}
	}

	std::cout << "! " << r << std::endl;
	fflush(stdout);
}

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;
}
posted @ 2025-01-18 11:04  califeee  阅读(27)  评论(0)    收藏  举报