A. Kuroni and the Gifts
ソートして出力すればよいです.
B. Kuroni and Simple Strings
開きカッコは左側から,閉じカッコは右側からとるとして二分探索します.
C. Kuroni and Impossible Calculation
$N>M$ なら鳩の巣原理より答は $0$ です.$N\leq M$ なら定義通りの計算が間に合います.
D. Kuroni and the Celebration
$2$ 頂点以上なら葉が $2$ 個あります.これを質問します.
返答がこの $2$ 点のどちらかならばそれが答です.そうでなければこの $2$ 点を削除してしまって答を求めればよいです.$1$ 回で $2$ 頂点消えることから目標クエリ回数が満たされます.
E. Kuroni and the Score Distribution
$A=(1,2,3,\ldots,n)$ のときが最大です.$k$ を固定したときの個数が最大化されているからです.
それ以下の値について,$(1,2,3,\ldots,m,x)$ の形で調整すれば作れます.あとは長さ $n$ になるように,当たり障りのない項を追加すればよいです.
F. Kuroni and the Punishment
答えの候補を適当に枝狩り判定.計算量保証ができていない解法でもなんでも通りそうな印象だが.
G. Kuroni and Antihype
$a_i=0$ であるような特殊頂点をひとつ追加します.invite 関係はそれを根とする根付き木です.各頂点について,出次数分のコストが発生です.したがって次数分のコストを発生させてから,$\sum a_i$ を引けばよいです.
結局,辺 $i,j$ のコストを $a_i+a_j$ としたときの最大全域木を求める問題だということになります.
Borouvka でこれを求めます.各頂点に対して,他の成分から,AND が $0$ であるような最大要素を見つけられればよいです.
「他の成分」という条件がなければ,subset に対する最大化なので,subset zeta で求まります.「他の成分」という条件を考慮するためには,上位 $2$ 種を保持するようにして subset zeta をすればよいです.$O((N+A\log A)\log N)$ 時間程度です.
H. Kuroni the Private Tutor
まず,列 $(x[0],x[1],\ldots,x[m-1])$ が実現できるかどうかを調べます.これは,流量下限付きフローが feasible かどうかという問題です.
- $s, t$:source, sink.
- $P[i]$:問題 $i$ を表す頂点.
- $Q[j]$:人間 $j$ を表す頂点.
- $s\to P[i]$:流量 $[L[i],R[i]]$ の辺.
- $P[i] \to Q[j]$:流量 $[0,1]$ の辺.
- $Q[j] \to t$:流量 $[x[j],x[j]]$ の辺.
これを変換したあとで max-flow, min-cut を使いたいという設定ですが,このままだと個人的にはよく分からなくなったので,さらに次のようにします.
- $t\to s$ に流量 $[0,\infty]$ の辺を追加する.
- feasible な循環流があるか求める.
流量下限付き循環流が feasible ですかという問題になりました.
これをさらに,新しい頂点 $S, T$ を使って,次のようにして下限なしの最大流問題に変換します.
- $u\to v$,流量 $[l,r]$ の辺を,$S\to v, u\to T$ という容量 $l$ の辺および,$u\to v$ で容量 $r-l$ の辺を張る.
- $S$ まわりの辺,$T$ まわりの辺がすべて飽和するようなフローがあるかどうかを調べる.つまり(下限なし) $S\to T$ 最大フローを求める.
この場合,次のようなネットワークの(下限なし)最大フローが $\sum L_i + \sum X_j$ になればよいです.

これで,maxflow, mincut の形になりました.任意のカットが $\sum L_i + \sum X_j$ 以上になってくださいという条件です.
$s,t$ を $S, T$ 側のどちらにするかを決めるごとに考えます.$s,t$ が同じ側にあるとしてよいです.
$Q[0],Q[1],\ldots,Q[m-1]$ のうち,$T$ 側にするものの個数 $k$ を決め打つと,これは prefix $k$ 個とするのが最適です(易).あとは各 $P_i$ ごとに $S,T$ 側のどちらに入れるかを独立に最適化できます.
最後に,$\sum x_j$ が定数であることを踏まえると,結局すべての条件が,$x_j$ の prefix sum に関する条件として書けます.結論,次のような問題になります.
- 非負整数からなる広義単調減少列 $x$ について,最大値の個数やその値を最大化してください.
- 各 $k$ について $\sum_{0\leq j < k} x_j$ の上界が与えられている.
- $\sum x_j$ が与えられている.
- いくつかの $x_j$ は与えられている.
なお,ここからも結構難しかったです.
「手前 $K$ 個を等しい値かつ $c$ 以上にできますか?」という判定問題を考えて二分探索します.
広義単調減少列にしたいのですが,まず広義単調減少列かつ項ごとに最小になるところで初期化します.この状態から,目標の総和に向けて加算するという形で考えます.prefix sum をおさえたいことから,加算場所はなるべく suffix 側に寄せるということになります.しかし,先頭 $K$ 個は同じ値にしないといけないのでちょっとややこしいです.
手前から処理していき,単調減少を保ったまま suffix 側で目標の総和にできるような値になるという条件下で,なるべく少ない加算で済ませるようにしていきます.
