【学习笔记】AGC009/AGC019/AGC029/AGC035
AGC009
Eternal Average
奥妙重重
如果我们用树的结构来描述操作,设一个点的深度为 x i x_i xi,那么一定满足 ∑ k − x i = 1 \sum k^{-x_i}=1 ∑k−xi=1,并且 Z = ∑ a i = 1 k − x i Z=\sum_{a_i=1}k^{-x_i} Z=∑ai=1k−xi。
方便起见,我们引入 k k k进制小数的概念。设 Z = 0. z 1 z 2 . . . z n Z=0.z_1z_2...z_n Z=0.z1z2...zn,其中 z i z_i zi表示 k − i k^{-i} k−i, z n ≠ 0 z_n\ne 0 zn=0 。
那么合法的小数部分 { z i } \{z_i\} {zi}应该满足:
1.1
1.1
1.1 如果不进位,那么
∑
i
=
1
n
z
i
=
n
\sum_{i=1}^n z_i= n
∑i=1nzi=n
1.2
1.2
1.2 如果进位,那么
∑
i
=
1
n
z
i
≤
n
\sum_{i=1}^nz_i\le n
∑i=1nzi≤n ,并且每次进位会导致数位之和减去
k
−
1
k-1
k−1,
∑
i
=
1
n
z
i
≡
n
(
m
o
d
k
−
1
)
\sum_{i=1}^n z_i\equiv n\pmod {k-1}
∑i=1nzi≡n(modk−1) 。
假设上述限制是充要的。换句话说,我们只关注 Z Z Z最终的形式,而不关注具体的方案。
不妨做一些逆向思考。知道了
Z
Z
Z的最终形式后,通过不断拆分高位可以得到恰好
n
n
n个数,而根据这
n
n
n个点的深度又可以把实际的操作树求出来。具体操作是,从根节点开始分裂,在每一层保留恰当的点数,不难自行验证。扯得有点远了
最后不要忘了 ∑ k − x i = 1 \sum k^{-x_i}=1 ∑k−xi=1这个条件,事实上这等价于 ∑ a i = 0 k − x i = 1 − Z = 0. ( k − 1 − z 1 ) ( k − 1 − z 2 ) . . . ( k − z n ) \sum_{a_i=0}k^{-x_i}=1-Z=0.(k-1-z_1)(k-1-z_2)...(k-z_n) ∑ai=0k−xi=1−Z=0.(k−1−z1)(k−1−z2)...(k−zn) ,根据上述推导得出 1 + ∑ i = 1 n ( k − 1 − z i ) ≤ m 1+\sum_{i=1}^n(k-1-z_i)\le m 1+∑i=1n(k−1−zi)≤m并且 1 + ∑ i = 1 n ( k − 1 − z i ) ≡ m ( m o d k − 1 ) 1+\sum_{i=1}^n(k-1-z_i)\equiv m\pmod {k-1} 1+∑i=1n(k−1−zi)≡m(modk−1) 。
让我们总结一下。设 d p i , j dp_{i,j} dpi,j表示当前从高到低考虑到第 i i i位,数位之和为 j j j的方案数。转移方程为 d p i , j = ∑ d p i − 1 , j − k dp_{i,j}=\sum dp_{i-1,j-k} dpi,j=∑dpi−1,j−k ,可以前缀和优化。因为 z n ≠ 0 z_n\ne 0 zn=0所以可能要用 0 / 1 0/1 0/1记录一下当前这位的状态。
复杂度 O ( n 2 ) O(n^2) O(n2)。
AGC019
Yes or No
组合数学题。
因为本人数学比较菜所以只会组合意义啦。
方便起见,我们引入坐标 ( x , y ) (x,y) (x,y)表示当前状态。那么对于一条路径,猜对的问题数目就是蓝边的数量。
如果这条路径多次穿过
y
=
x
y=x
y=x,那么我们只保留第一个交点,并对路径作对称,这样蓝边的数目并不会改变。
设交点坐标是
(
x
,
x
)
(x,x)
(x,x),发现蓝边的数目
(
n
−
x
)
+
x
=
n
(n-x)+x=n
(n−x)+x=n是定值!最后我们认为对角线的贡献是路径与对角线的交点数目/2 。
答案是 n + ∑ i = 1 m ( 2 i i ) ( n + m − 2 i n − i ) 2 ( n + m n ) n+\frac{\sum_{i=1}^m\binom{2i}{i}\binom{n+m-2i}{n-i}}{2\binom{n+m}{n}} n+2(nn+m)∑i=1m(i2i)(n−in+m−2i)。
复杂度 O ( n ) O(n) O(n)。
remark \text{remark} remark 妙处在于发现潜在的组合意义。
AGC029
Wandering TKHS
考虑 u u u到根节点的路径为 { t 1 , t 2 , . . . , t k } \{t_1,t_2,...,t_k\} {t1,t2,...,tk},当从 t i t_i ti走到 t i + 1 t_{i+1} ti+1时,会扩展子树内比 t i + 1 t_{i+1} ti+1小的节点。因此想到设 d p i dp_i dpi表示从 i i i走到 f a i fa_i fai时,子树内扩展了多少个点。
记 F ( u , v ) F(u,v) F(u,v)表示从 u u u到 v v v的路径上不包括 v v v的最大的点,那么 v ∈ s u b t r e e ( u ) v\in subtree(u) v∈subtree(u)有贡献等价于 F ( v , u ) < F ( 1 , u ) F(v,u)<F(1,u) F(v,u)<F(1,u) 。注意到 F ( 1 , u ) F(1,u) F(1,u)是定值,因此只需维护 F ( v , u ) F(v,u) F(v,u)。
考虑自底向上维护,假设 x ∈ s o n ( u ) x\in son(u) x∈son(u),对于小于 x x x的路径直接设为 x x x,用 ( v a l , c ) (val,c) (val,c)记录权值为 v a l val val的路径有 c c c条,可以手写平衡树,复杂度 O ( n log 2 n ) O(n\log^2 n) O(nlog2n) 。当然,线段树合并是更优秀的写法,复杂度 O ( n log n ) O(n\log n) O(nlogn)。
Construction of a tree
神仙构造题。
我们首先构造二分图,左边是 n n n个节点,右边是 n − 1 n-1 n−1个集合, ( u , E i ) (u,E_i) (u,Ei)有边当且仅当 u ∈ E i u\in E_i u∈Ei。
然后有解的必要条件是,对于右边任意 S ⊆ { E 1 , E 2 , . . . , E n − 1 } S\subseteq\{E_1,E_2,...,E_{n-1}\} S⊆{E1,E2,...,En−1},设其对应的点集为 f ( S ) f(S) f(S),都有 ∣ S ∣ < f ( S ) |S|<f(S) ∣S∣<f(S),否则一定会形成环。
事实上这是充要的。给出如下构造。
首先求一个大小为 n − 1 n-1 n−1的匹配。钦定左边没有被匹配的 v v v为根节点,从 v v v开始跑 D F S DFS DFS树(首先把之前的匹配加进 D F S DFS DFS树中),对于右边集合相连的两个点就在原树上连一条边。如果过程中途停止的话,当且仅当,对于所有左侧经过的点,与它们相邻的右边的点都经历过了,并且没有扩展出新点。
因为此时左边点多一个 v v v,所以左边点数比右边点数多 1 1 1,那么取右边边未经过的点, 它们在左侧对应的点也是未被经过的,那么 f ( S ) = ∣ S ∣ f(S)=|S| f(S)=∣S∣,矛盾。
比较复杂。感性理解一下就好。
复杂度 O ( n n ) O(n\sqrt{n}) O(nn) 。瓶颈在于 dinic \text{dinic} dinic求最大匹配。
AGC035
Add and Remove
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530092.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」