转化一下询问即为区间$max - min + 1 = cnt$,其中$cnt$表示区间内数的种类数。 即求有多少区间$max - min - cnt=-1$,注意到任意区间的$max-min-cnt \geq -1$,那么即维护区间$max-min-cnt$的最小值和最小值的个数,再看最小值等不等于$-1$就行了。 那么可以用扫描线扫右端点$r$,线段树维护左端点为$1, 2,\dots,r-1$的区间最小值和最小值的个数。每加入一个数,$r$这里必定为$-1$,所以当前区间最小值的个数就是答案了。 对于区间种类数就$[last[a[i]], i - 1]$多了$1$,那么要减去$1$,因为在式子里$cnt$,前面是负号。 然后最大值最小值就用两个单调栈搞一下就好了。区间加上对应的差值即可。 #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5 + 7; int top1, top2, a[N], st1[N], st2[N]; map<int, int> pos; struct Seg { #define lp p << 1 #define rp p << 1 | 1 int tree[N << 2], lazy[N << 2], sum[N << 2];