2025.6.15 模拟赛

6.15 模拟赛

100+20+44,不会 T3 的 \(O(n)\) dfs 求距离和/kk

T1 的分段打表也没怎么接触过,听同学们说了好一会才反应过来/kk

math

分段打表 + 裂项 卡常题

\(k=1\) 显然只能打表,没有任何其他做法。但显然不能打 \(O(p)\),于是可以平衡代码复杂度和查询的时间复杂度,打 \(O(\sqrt p)\)\(B\) 的倍数的表,散块暴力做。

\(k\ge 2\) 的是小学裂项,显然可以从 \(k\) 项裂成 \(k-1\) 项,乘系数。于是直接区间 dp 推到每一项的系数,再交换求和顺序,就转化成 \(k\)\(k=1\) 的问题。

写好一点可以达到 \(O(k^2+\sqrt p)\) 的复杂度,需要进行一定的记忆化及卡常。

sequence

ZAK 加强题,加强于 AGC049F,ZAK tql!

理论推导题,代码简单。

\(g(x)=\sum |A_i-x|-\sum |B_i-x|\),最终目的是 \(g(x)\le 0\)

注意到可以把 \(i\to i+1\)\(i+1\to i+2\) 独立考虑,因为后者的花费严格大于前者,于是选择前者一定比后者更优。
若存在 \(i\to i+1,j\to j-1\),则 \(i+1\le j-1\) ,否则把两个操作都删掉一定更优。于是存在一个分界点 \(mid\),使得只存在 \(i< mid\)\(i\to i+1\)\(i> mid\)\(i\to i-1\),若有多个 \(mid\),选择 \(g(x)\) 最大的。
操作后必然有 \(g(mid)=0\),而所有操作都让 \(g(mid)\) 减少,减的最多,结果最大,说明一开始就是最大的。
找到 \(mid\) 后就变成两半只有增加的问题,而我们是可以通过 \(\sum A'_i=\sum B_i\) 推出两边的操作次数的。
考虑类似 wqs 二分,二分斜率 \(M\),把所有代价 \(\le M\) 的操作做了,然后在新点上继续二分。注意到我们仍然可以找到一个分界点 \(mid\) 满足之后的操作 \(mid\) 左边只向右,\(mid\) 右边只向左,且 \(g(mid)\) 还是最大的。
做一个类似于整体二分的东西即可,注意二分边界。
复杂度 \(O(n\log n(\log A+\log B+\log C))\)

still

神秘交互构造题,孙哥 tql!

首先问一次根得到 \(dep_x\),接下来考虑逐层确定 \(x\) 在哪个子树内。

假设现在确定 \(x\)\(u\) 子树内,想知道 \(x\)\(u\) 的哪个儿子子树内。考察当前询问的集合 \(S\),若不包含与 \(x\) 同子树的点,则 \(\sum dis(i,x)=\sum dep_i + |S|(dep_x-2dep_u)\),否则 \(\sum dis(i,x)<\sum dep_i + |S|(dep_x-2dep_u)\)

由于我们只能询问 \(17\) 次,每次询问应当对很多层的确定产生贡献。考虑给每个点分配一个询问集合 \(T_i\),表示这些询问包含了 \(i\) 子树内的点,可以成为判定 \(i\) 的依据。

我们显然要求 \(u\) 的所有儿子对应 \(T_i\) 不同,且必须是 \(T_u\) 的子集。同时,我们希望 \(T_i\) 的元素个数尽可能多。按照子树从大到小分配 popcount 从大到小的子集即可。

预处理 \(T_i\),统一进行询问,再逐层确定 \(x\) 的位置。

posted @ 2025-06-16 09:04  Cindy_Li  阅读(18)  评论(0)    收藏  举报