分块做法 RE + WA 求大佬改正
查看原帖
分块做法 RE + WA 求大佬改正
1025321
midsummer_zyl楼主2024/1/6 15:24
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10;
int a[N], L[N], R[N], b[N];
int tag[N], bel[N], sum[N];
vector <int> vec;
inline int query(int x) {
	return lower_bound(vec.begin(), vec.end(), x) - vec.begin();
}
inline void update(int l, int r) {
	int p = bel[l]; a[l] = r;
	for (int i = L[p]; i <= R[p]; ++i)
		b[i] = a[i];
	stable_sort(b + L[p], b + R[p] + 1);
}
inline int solve(int l, int r, int k) {
	int ans = 0, p = bel[l], q = bel[r];
	if(p == q) {
		for (int i = l; i <= r; ++i)
			if(a[i] == k)
				ans++;
		return ans;
	}
	for (int i = l; i <= min(r, R[p]); ++i)
		if(a[i] == k)
			ans++;
	for (int i = L[q]; i <= r; ++i)
		if(a[i] == k)
			ans++;
	for (int i = p + 1; i < q; ++i) {
		int lv = lower_bound(b + L[i], b + R[i] + 1, k) - b;
        int rv = lower_bound(b + L[i], b + R[i] + 1, k + 1) - b - 1;
        ans += rv - lv + 1;
    }
	return ans;
}
inline int read() {
	int f = 1, s = 0;
	char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-') f = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9') {
		s = s * 10 + c - '0';
		c = getchar();
	}
	return f * s;
}
int main() {
	int n = read(), m = read();
	int siz = sqrt(n), blo = (n - 1) / siz + 1;
	for (int i = 1; i <= blo; ++i) {
		L[i] = (i - 1) * siz + 1;
		R[i] = min(n, i * siz);
	}
	for (int i = 1; i <= n; ++i) {
		a[i] = read(); b[i] = a[i];
		vec.push_back(a[i]);
		bel[i] = (i - 1) / siz + 1;
		sum[bel[i]] += a[i];
	}
	for (int i = 1; i <= m; ++i) {
		char x; scanf("%c ", &x);
		if(x == 'Q') {
			int l, r, k;
			l = read(), r = read(), k = read();
			printf("%d\n", solve(l, r, k));
		} else {
			int l, r; l = read(), r = read();
			update(l, r);
		}
	}
	return 0;
}

样例过了,求大佬改正,悬关

2024/1/6 15:24
加载中...