DOJ logoDOJ
問題
最近追加された問題保存した問題Workbooks
カテゴリDLCコンテストグループチーム掲示板
ランキング
正解数ランキングストリークランキングDOJ Powerランキング
提出状況
問題募集ログイン新規登録
DOJ logoDOJ

OI形式のサブタスク採点、Eloレーティング、Discord認証を備えたオンラインジャッジです。

問題
問題一覧カテゴリ
コミュニティ
コンテストランキング掲示板お知らせ外部のコンテストを開催するガイド
アカウント
ログイン新規登録ジャッジ状態
ポリシー
利用規約DLCの利用規則プライバシーAPI 文書言語ランタイムコンテストの順位報酬レーティングとパフォーマンス
© 2026 DOJ
All rights reserved
解説

Star Tree

問題に戻る

解説

サブタスク 1:直接更新

各クエリについて BFS で xxx から yyy へのパスを求め、xxx から順に 1,2,…1,2,\ldots1,2,… を加える。時間は O(N+NQ)O(N+NQ)O(N+NQ)、空間は O(N)O(N)O(N) であり、N,Q≤2000N,Q\leq2000N,Q≤2000 に十分である。

サブタスク 2:番号順のパス

辺が {i,i+1}\{i,i+1\}{i,i+1} なら、パスは整数区間になる。x<yx<yx<y なら [x,y][x,y][x,y] の頂点 vv に を加え、それ以外では に を加える。 の係数と定数項を二つの差分配列で更新し、累積和を取れば時間 、空間 で解ける。

全体の解法:深さの一次式

頂点 111 を根とし、深さを d(v)d(v)d(v)、親を p(v)p(v)p(v) とする。根の深さは零、親は仮想頂点 000 とする。クエリ (x,y)(x,y)(x,y の LCA を とし、パスを から までと、 の次から までに分ける。

最初の区間で頂点 vvv に加える量は

d(x)−d(v)+1=−d(v)+(d(x)+1)d(x)-d(v)+1=-d(v)+(d(x)+1)d(x)−d(v)+1=−d(v)+(d(x)+

であり、二番目の区間では

d(x)−d(z)+d(v)−d(z)+1=d(v)+(d(x)−2d(z)+1)d(x)-d(z)+d(v)-d(z)+1=d(v)+(d(x)-2d(z)+1)d(x)−d(z)+d(v)−d(z)+

である。したがって、各区間に深さの係数と定数項を別々に加えればよい。zzz は最初の区間だけに含める。

祖先区間に対する木の差分

www が uuu の祖先なら、uuu から www までの両端を含む区間に定数 ccc を加える操作は

D[u]+=c,D[p(w)]−=cD[u]\mathrel{+}=c,\qquad D[p(w)]\mathrel{-}=cD[u]+=c,D[p(w)]−=c

と記録できる。すべての記録後、子の値を親へ下から上に加える。各頂点の結果は、その部分木にある差分の和になる。uuu から始まる寄与は www まで届き、その上では p(w)p(w)p(w) の逆符号の記録で打ち消される。

深さの係数用の配列 AAA と定数項用の配列 BBB を用意する。クエリごとに c1=d(x)+1c_1=d(x)+1c1​=d(x)+1、 として

A[x]−=1,B[x]+=c1,A[x]\mathrel{-}=1,\quad B[x]\mathrel{+}=c_1,A[x]−=1,B[x]+=c1​, A[p(z)]+=1,B[p(z)]−=c1,A[p(z)]\mathrel{+}=1,\quad B[p(z)]\mathrel{-}=c_1,A[p(z)]+=1,B[p(z)]−=c1 A[y]+=1,B[y]+=c2,A[y]\mathrel{+}=1,\quad B[y]\mathrel{+}=c_2,A[y]+=1,B[y]+=c2​, A[z]−=1,B[z]−=c2A[z]\mathrel{-}=1,\quad B[z]\mathrel{-}=c_2A[z]−=1,B[z]−=c2​

を記録する。二番目の区間は zzz を含まないので、p(z)p(z)p(z) ではなく zzz で打ち消す。y=zy=zy=z なら二つの記録が直ちに相殺され、空区間を正しく表す。

全クエリの後、親が子より先に現れる順序を逆にたどり、各頂点の A,BA,BA,B を親に加える。仮想頂点 000 の値は出力せず、実際の木へ再び伝播させない。頂点 vvv の答えは

A[v]d(v)+B[v](mod998 244 353)A[v]d(v)+B[v]\pmod{998\,244\,353}A[v]d(v)+B[v](mod998244353)

である。

正当性と計算量

二つの区間は元のパスを重複なく分割し、各一次式は xxx からの距離に一を足した値に等しい。木の差分は各区間の頂点だけに正しい係数を加える。線形性により、全クエリをまとめて累積しても一つずつ直接更新した結果と一致する。

二進リフティングによる LCA を用いれば、前処理 O(Nlog⁡N)O(N\log N)O(NlogN)、クエリごとに O(log⁡N)O(\log N)O(logN)、最後の累積 O(N)O(N)O(N) で、全体は時間 O((N+Q)log、空間 となる。 ではクエリは存在できず答えは零である。深さ の木もあるため、親と深さの構築および累積は再帰を使わずに行う。

独立検証用の解法

別の HLD 実装はパスを向き付きの連続番号区間に分解する。xxx 側の区間を得た順に並べ、yyy 側の区間を逆順に続ける。次に加える値を保持すれば、各区間への加算を番号の係数 +1+1+1 または −1-1−1 と定数項で表せる。これを通常の配列差分で処理する。上記の深さの式ではなく、区間の実際の順序と長さを用いる。時間は O(N+Qlog⁡N)O(N+Q\log N)O(N+、空間は である。

整数の範囲

一頂点の最終的な整数値は QN≤2.5⋅1011QN\leq2.5\cdot10^{11}QN≤2.5⋅1011 以下である。差分や負の中間値も符号付き 64 ビット整数に十分収まる。差分を 32 ビットで保存したり、32 ビット同士の乗算後に 64 ビットへ変換したりしてはいけない。すべて 64 ビットで累積し、出力時にだけ剰余を取ってもよい。

Solution written by GPT6

v
v−x+1v-x+1v−x+1
[y,x][y,x][y,x]
x−v+1x-v+1x−v+1
vvv
O(N+Q)O(N+Q)O(N+Q)
O(N)O(N)O(N)
)
zzz
xxx
zzz
zzz
yyy
1
)
1=
d(v)+
(d(x)−
2d(z)+
1)
c2=d(x)−2d(z)+1c_2=d(x)-2d(z)+1
c2​=d(x)−2d(z)+1
​
,
⁡N)O((N+Q)\log N)
O((N+Q)logN)
O(Nlog⁡N)O(N\log N)O(NlogN)
N=1N=1N=1
499 999499\,999499999
Q
log
N
)
O(N)O(N)O(N)