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:
