Official

E - LEQ and NEQ Editorial by ynymxiaolongbao


包除原理を用います。

\(dp[pos][k]\) を、 \(X[1],X[2],\ldots,X[pos]\) を決めて、意図的に \(X_i=X_{i+1}\) とした \(i\) の個数が \(k\pmod{2}\) であるような決め方の総数とします。答えは \(dp[N][0]-dp[N][1]\) です。

\(dp[pos'][k+(pos'-pos-1)]+=\min(A[pos+1],..,A[pos']) \times dp[pos][k]\) と遷移できます。この計算量は \(O(N^2)\) でまだ間に合いません。

この遷移は Cartesian Tree の構造に注目して \(\min(A[pos+1],..,A[pos'])\) ごとにまとめることができます。概要は以下の通りです。

  • \(i\) の昇順に、\(\min(A[pos+1],..,A[pos'])\)\(A[i]\) である時の遷移を行います。ただし、\(A\) に同じ値が複数現れる場合は適当に順序を付けておきます。
  • \(i\) の遷移をするまでに \(pos<i\) までの \(dp\) の値はすべて定まっていて、\(pos+k\) の偶奇で分けて累積和を取っておきます。
  • そこから遷移先 \((pos>=i)\) に対して、\(pos+k\) の偶奇で分けて区間加算をimos法によって行います。

Cartesian Tree を stackを用いて求めれば、計算量は \(O(N)\) になります。

posted:
last update: