Skip to content

Instantly share code, notes, and snippets.

@FF256grhy
Created December 18, 2019 17:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save FF256grhy/505a852b745dd501b734e2271b35b324 to your computer and use it in GitHub Desktop.
Save FF256grhy/505a852b745dd501b734e2271b35b324 to your computer and use it in GitHub Desktop.
yukicoder No. 956 解説
*問題文
No.956 Number of Unbalanced - yukicoder
https://yukicoder.me/problems/no/956
*解法
数列 A に値 v が現れる個数を C(v) で表す。
各 v ごとに、v が過半数となる連続部分列の個数を数える。
その際、C(v) が大体 √(2N) より大きいか小さいかで場合分けをする。
大きい場合は、普通のセグ木を使って各 v ごとに O(N log(N)) 時間かけて普通に計算する。
小さい場合は、組合せの計算を頑張ると各 v ごとに O(C(v)^2) 時間で計算できる。つまり、連続部分列に含まれる v の右端と左端の位置を決めると、その場合の連続部分列の個数は O(1) で求められる。
Q:なんで境界が √(2N) なんですか?
A:√N でやってみたら TLE だったので……(適当)
Q:組合せの計算って具体的に何?
A:0 <= x < X かつ 0 <= y < Y かつ x+y < Z を満たす整数の組 (x, y) の個数を求める、みたいな問題が解ければよいです。これの解き方は……説明がめんどいので↓の提出コードを読んでね☆(手抜き解説)
*提出コード
https://yukicoder.me/submissions/410221
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment