关于insert和query的位置$\color{white}qwq$
查看原帖
关于insert和query的位置$\color{white}qwq$
390770
D2T1xubiaoshi楼主2021/10/6 13:14

rt

//P5459
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10, lg = 25;
const long long R = 1e10 + 10;
long long l, r, sum[N], ans;
int n;

struct Node{ int l, r; long long sum; } T[N*lg*4]; int rt, cnt;
void update(int p){ T[p].sum = T[T[p].l].sum + T[T[p].r].sum; }
void modify(int &p, long long pos, long long val, long long l = -R, long long r = R){
	if(!p) p = ++ cnt;
	if(l == r){ T[p].sum += val; return; }
	long long mid = l + r >> 1;
	if(pos <= mid) modify(T[p].l, pos, val, l, mid);
	else modify(T[p].r, pos, val, mid + 1, r);
	update(p);
}
long long query(int &p, long long ql, long long qr, long long l = -R, long long r = R){
	if(!p) p = ++ cnt;
	if(ql <= l && r <= qr) return T[p].sum;
	long long res = 0, mid = l + r >> 1;
	if(ql <= mid) res += query(T[p].l, ql, qr, l, mid);
	if(mid < qr) res += query(T[p].r, ql, qr, mid + 1, r);
	return res;
}

int main(){
	scanf("%d%lld%lld", &n, &l, &r);
	for(int i = 1; i <= n; ++ i){
		scanf("%lld", &sum[i]);
		sum[i] += sum[i-1];	
	}
	modify(rt, 0ll, 1ll);
	for(int i = 1; i <= n; ++ i){
		ans += query(rt, sum[i] - r, sum[i] - l);
		modify(rt, sum[i], 1ll);
		//先query再modify:100pts
		//先modify再query:80pts
	}
	printf("%lld\n", ans);
	return 0;
}

为什么?

2021/10/6 13:14
加载中...