Educational Codeforces Round 66
F
题意:长度为 n 的序列,求有多少个区间 ([l,r]) ,使得其构成了一个 1~r-l+1 的排列。 (n le 3*10^5, a_i le n)
key:随机权值
合法区间中肯定包含 1 ,并且最大值就是长度。先考虑最大值在 1 的右边的情况,可以枚举每个 1 的右边,记录最大值 x ,此时需要检查 ([r-x+1,r]) 这个区间是否是一个排列。最大值在 1 左边的情况同理。
考虑 hash :给 1~n 的每个数字一个 64 位的随机权值,定义为 (h_i) ,这样一个长度为 k 的排列的 hash 必须是 (h_1 xor h_2 dots xor h_k) ,这样就可以 O(1) check 了,所以复杂度是 O(n)。