E - Max Min Editorial by kyopro_friends


\(A\) 連続部分列で、minが \(m\) 以上かつmaxが \(M\) 以下であるものの個数」を \(f(m,M)\) とすると、包除原理より求めるものは \(f(Y,X)-f(Y+1,X)-f(Y,X-1)+(Y+1,X-1)\) となります。

\(f(x,y)\) は、\(x\) 未満または \(y\) より大きな要素によって数列を分割したときの、長さのみから求めることができます。

pythonの場合 groupby メソッドを用いると実装が容易です。

python

from itertools import groupby
N,M,m=map(int,input().split())
A=list(map(int,input().split()))

def f(l,r):
	ans=0
	for ok, group in groupby(l<=x<=r for x in A):
		if ok:
			L=len(list(group))
			ans+=L*(L+1)//2
	return ans

print(f(m,M)-f(m+1,M)-f(m,M-1)+f(m+1,M-1))

posted:
last update: