序列是 1∼n 的一个排列。一个区间能构成排列,当且仅当它包含的数恰好是 1,2,…,k(k 为区间长度)。
因此只需检查:对每个 k=1,2,…,n,数值 1,2,…,k 在原序列中出现的位置是否构成一段连续下标。若这些位置的最大下标与最小下标之差加一等于 k,则它们挤在长度为 k 的区间里,该区间就是一个排列区间。
实现时把每个值与其下标组成二元组,按值升序排序,然后扫 k 从 1 到 n,维护前 k 个值下标的最小值与最大值并判断即可。
有 T 组数据。每组给定一个长度为 n 的序列 a1,a2,…,an,保证其中元素互不相同,且每个 ai 满足 1≤ai≤n。 称区间 [l,r] 是一个排列区间,当且仅当其中的数 al,al+1,…,ar 恰好构成某个长度的排列:即存在正整数 k,使得这些数是 1 到 k 各出现一次。 请对每组数据求出排列区间的个数。
约束条件:
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.