链接
\(\text{2019银川网络赛-L.Continuous Intervals}\)
题意
给定一个长度为\(n\)的正整数序列\(a\),对于一个\([l,r]\)区间内排序后,区间内任意相邻两数的差的绝对值都小于1,这样的区间有多少个。
输入格式:第一行一个\(t\),表示\(t\)个样例,之后每个样例的第一行输入一个数\(n\),第二行\(n\)个数表示序列\(a\)。
数据范围:\(1\leq n\leq 10^6,1\leq a_i\leq 10^9\).
输出格式:对于每个查询操作,输出一行一个结果Case #x: y
,表示第\(x\)个样例的结果是\(y\)。
分析
排序后的区间任意相邻两数的差小于等于1,\(max、min\)为区间最大值、最小值,\(cnt\)为区间数的种类,那么显然的,任意一个区间都有\(max-min-cnt\geq -1\),而对于此题来说即是要求满足\(max-min-cnt= -1\)的区间的个数,我们可以枚举\(r\),求满足条件的\(l\)的个数。
我们可以用线段树动态的维护\(max-min-cnt\)的最小值,以及这个最小值的个数;
当枚举\(r\)的过程中,我们需要考虑当前这个数\(a[x]\),对于\(max、min、cnt\)产生的影响,即当\(a[x]\)作为区间最大值,作为区间最小值所影响到的区间,以及\(a[x]\)上一次出现到\(x\)位置的区间内对\(cnt\)的影响。
使用两个单调栈能够求出\(a[x]\)作为区间最大值,作为区间最小值所影响到的区间,在这个区间内进行修改\(max-min-cnt\),加上\(a[x]\)带来的影响
https://blog.csdn.net/Cassie_zkq/article/details/100388082这篇博客讲的比较清楚。
代码
1 |
|