权值线段树 MLE on #6 求助
查看原帖
权值线段树 MLE on #6 求助
569316
CloudWings楼主2023/11/25 14:19

rt.

Record

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5, M = 1e5 + 5, logM = 34;
int n, L, R, _id, rt; ll a[N+5], ans;
struct node {
	int ls, rs, val;
} d[N*logM];
int NewNode () { return d[++_id] = {0,0,0}, _id; }
void Update (int &p, int x, int y, ll l=-1e10, ll r=1e10) {
	if (!p) p = NewNode();
	if (l == r) return void(d[p].val += y);
	int mid = l+r>>1;
	if (x <= mid) Update(d[p].ls, x, y, l, mid);
	if (x > mid)  Update(d[p].rs, x, y, mid+1, r);
	d[p].val = d[d[p].ls].val + d[d[p].rs].val;
}
int Query (int &p, ll s, ll t, ll l=-1e10, ll r=1e10) {
	if (!p) return 0;
	if (s <= l && r <= t) return d[p].val;
	int mid = l+r>>1, res = 0;
	if (s <= mid) res += Query(d[p].ls, s, t, l, mid);
	if (t > mid)  res += Query(d[p].rs, s, t, mid+1, r);
	return res;
}
int main () {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> L >> R;
	for (int i = 1; i <= n; i++) cin >> a[i], a[i] += a[i-1];
	Update(rt, a[0], 1); 
	for (int i = 1; i <= n; i++) {
		ans += Query(rt, a[i]-R, a[i]-L);
		Update(rt, a[i], 1);
	}
	cout << ans;
	return 0;
}
2023/11/25 14:19
加载中...