[TJOI2019]甲苯先生的线段树

题意

对于\(d\)层完全二叉树,\(T\)次查询,给定\(a,b\),求\(a,b\)路径编号和\(x\),以及树上有多少条路径编号和为\(x\)\(d\le 50,T\le 10\)

做法

\(cnt(x)\)\(x\)二进制中\(1\)的个数
结论1:点\(x\)到根路径和为\(2x-cnt(x)\)。在树根为\(1\)\(0\)时均成立。

证明:
没想到什么简单的办法,暴力归纳一下即可

结论2:记路径和为\(s\),两端为\(x,y\),令\(z=lca(x,y)\),若\(z\longrightarrow x\)经过\(a\)条边,\(z\longrightarrow y\)经过\(b\)条边。若\(s,a,b\)为定值,\(z\)也为定值

证明:
\(s,a,b\)为定值
\(z\)的二进制有\(t\)位,则整条路径上的点前\(t\)位是确定的,显然整条路径前t位之和为\((2^{a+1}+2^{b+1}-3)z\)
\(k\)为其他贡献:\(k\)的最小值为\(x\)一直往左走,\(y\)往右走一步后一直往左走;\(k\)的最大值为\(x\)往左走一步后一直往右走,\(y\)一直往右走。故\(k\in [2^b-1,2^a+2^{b+1}-a-b-3]\)
因为\(k<2^{a+1}+2^{b+1}-3\),所以\(z\)是定值,为\(\frac{s}{2^{a+1}+2^{b+1}-3}\)
\(k=s\%z\),即除开前\(t\)位的贡献,令\(x,y\)除掉前\(t\)位后位\(x',y'\),根据结论1\(2(x'+y')-cnt(x')-cnt(y')=k\)。显然得满足\(x'<2^{a-1},y'<2^b\)\(y'\)\(b\)位为\(1\)

然后这题就只用先算出\(s\),枚举\(a,b\),转化问题为求有多少个\(x',y'\)满足上面那个条件

posted @ 2020-04-12 10:50  Grice  阅读(129)  评论(0)    收藏  举报