C. Find B

https://codeforces.com/problemset/problem/1923/C

题意:构造题,问能否重构区间,要求重构后区间和不变,且之前位置与新区间位置不能有相同字符。

思路:题目不要求使用原区间数字,如果有这个要求,那就是一个区间出现次数最多数字的问题。那么这个问题可以从构造的角度考虑,我们可以对数字进行变换,或者换位,只要保证补相同位置不重复即可。先考虑无解的情况:假如有很多个1,那么无论怎么重构,这些1都不会消失,如果1的数量够多,那就无解。 关键在于如何定义”够多”这个概念。假如有一个区间,我们将所有的1变为其他的数(这里取2,先使得区间和最小),并将所有其他的数变成1,如果此时这个区间和 <=之前的区间和,那么我们可以将差值随意加到任意一个数上,如果这个区间和已经大于之前的区间和,那则说明无解。

inline void solve() {
	int n, q;
	cin >> n >> q;

	vector<long long> pref(n + 1);
	vector<int> cnt(n + 1);
	for (int i = 1; i <= n; ++i) {
		cin >> pref[i];
		cnt[i] = cnt[i - 1] + (pref[i] == 1);
		pref[i] += pref[i - 1];
	}

	while (q --) {
		int l, r;
		cin >> l >> r;
		int len = r - l + 1;
		int cnt1 = cnt[r] - cnt[l - 1];
		long long sum = pref[r] - pref[l - 1];
		if (len > 1 && cnt1 * 2 + (len - cnt1) <= sum) {
			cout << "yes\n";
		}
		else {
			cout << "no\n";
		}
	}
}
posted @ 2025-04-22 09:29  _Yxc  阅读(14)  评论(0)    收藏  举报