动态开点 加 权值线段树
~~### 小萌新 什么也不会 写得详细一些吧 ~~ 【[BJOI2016]回转寿司】 首先,暴力查找--30分 然后,黑科技---权值线段树 s[]表示前缀和,题目要求的是有多少对(i,j)满足L≤s[j]-s[i]≤R(i<j),变形一下得到s[j]-R≤s[i]≤s[j]-L 因此我们只需要遍历一遍s[]数组,每次对于当前的前缀和s,我们先在线段树上查询区间[s-R,s-L]内有多少个数,然后再把s加入到线段树中,最终求和即可 参考 https://blog.csdn.net/blessLZH0108/article/details/77072022 一般的线段树储存一段线段的信息, 然后这里维护的是单纯的数字,其实本质上没啥差别、、 一般数字比较大,我们就要考虑动态开点, 因为只有当用到时才开,会节省很大空间, 对于这道题是n*log(1e14) 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int maxn=1e5+50; 5 int tot; 6 const ll inf=10000000000+50; 7 ll rt; 8 ll lson[maxn*40*4],rson[maxn*40*4]; 9 struct tre 10 { 11 long long