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";
}
}
}

浙公网安备 33010602011771号