求助分块 RE+TLE
查看原帖
求助分块 RE+TLE
1074583
_Revali_楼主2024/10/8 10:42

code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int L = 2000;
int n, id[200005], st[1005], ed[1005], a[200005], b[200005];
ll lst, S[200005];
ll query(ll l, ll r, ll x){
	int s = id[l], e = id[r];
	ll sum = 0;
	if(s == e){
		for(int i = l; i <= r; i++){
			if(a[i] > x) continue;
			sum += a[i];
		}
		return sum;
	}
	for(int i = l; i <= ed[s]; i++){
		if(a[i] > x) continue;
		sum += a[i];
	}
	for(int i = st[e]; i <= r; i++){
		if(a[i] > x) continue;
		sum += a[i];
	}
	for(int i = s + 1; i <= e - 1; i++){
		if(b[st[i]] > x) continue;
		int p = upper_bound(b + st[id[i]], b + ed[id[i]] + 1, x) - b - 1;
		sum += S[p];
	}
	return sum;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		id[i] = (i - 1) / L + 1;
		if(id[i] != id[i - 1]){
			st[id[i]] = i;
			ed[id[i - 1]] = i - 1;
		}
		b[i] = a[i];
	}
	for(int i = 1; i <= (n - 1) / L + 1; i++){
		sort(b + st[i], b + ed[i] + 1);
		S[st[i]] = b[st[i]];
		for(int j = st[i] + 1; j <= ed[i] - st[i]; j++) S[j] = S[j - 1] + b[j];
	}
	int q;	
	cin >> q;
	while(q--){
		ll l, r, x;
		cin >> l >> r >> x;
		l ^= lst;
		r ^= lst;
		x ^= lst;
		lst = query(l, r, x);
		cout << lst << '\n' ;
	}
	return 0;
}
2024/10/8 10:42
加载中...