2022.08.02 NOI模拟赛
1.时间安排
7:30~8:00
T1:数据结构题,对每个点求到其他所有点的第K短路径,有 $ n^2log $ 和只求最大值的DP38分,还有34分应该是 \(n\sqrtnlogn\) 或者三个log。
T2:树上DP题,给定根的树,问K次access后得到的不同树的形态数量,只会暴力的21分,链的23分也许有规律可循。
T3:简单推一推可以暴力fwt做 \(n^3logn\),暂时想不到怎么做。
8:00~8:30
先打了T1的暴力和最大值的DP,大样例没问题。
8:30~9:30
先打了T3的暴搜,然后写推的fwt,发现因为unsigned long long 自然溢出的问题,导致负数计算出错,突发奇想因为 \(80^6\) 大概是2e12,就找了个1e13级别的模数,样例没问题。
9:30~10:00
先打了T2的暴力,然后打表发现当树形态是链的时候,答案是 \(\sum_{i=0}^{k}C_{n-1}^k\),可以O(min(n,k))解决。
之后想了想怎么写DP,分讨太困难了,不会(不想)分讨。
10:00~12:00
因为T1保证树形态随机,可以直接暴力往根上跳,第K大可以二分答案转判定,问题转化成了如何求小于等于mid的路径条数。
想了若干种方法,都是\(n^2\)的很难受。
到11点左右突然想可以用主席树维护每棵子树所有点到子树根的距离,打了个主席树,样例没问题。
后来想了想怎么降log,数据结构是严格难于log,不可能降下去,跳链是题目性质也不能动,所以只能从二分下手。
想到似乎可以线段树上二分,但是值域不同,看上去没法做。
12:00~12:30
开摆。
result:
T1:38(本地跑了72分) T2:44 T3:29
2.总结
T1:
脑子出故障了,能直接用vector做非要写主席树,不知道自己怎么想的。
但是正解确实是线段树上二分。
J神给出了不一样的做法,还没明白,给出自己写的线段树二分实现。
首先维护的东西变成 \(dis[i]-2*dis[subtree_root]\) ,结合树上两点距离计算方式,查询小于等于mid-dis[x]的路径数量即可,可以同时对x到根1的log棵线段树同时二分,这时值域是相同的就可以做了。
但是会算重一些点,比如对于某点p和他的父亲fa,如果一个点q满足了 \(dis[q]-2*dis[fa]<=mid\) 且 \(dis[q]-2*dis[p]+2*(p,fa)<=mid\)
额外对每棵子树多维护一棵线段树即可。
T2:
%L神61分DP
回来补上题解
(待upd)
T3:
%J神62分
实际上一个部分是max卷积(没看出来……),可以用前缀和优化。
这个前缀和优化有一个简单的实现:
先把两个多项式分别做前缀和,暴力乘后再差分即可。
这题暴力乘前加上fwt就行,之后ifwt回去。
正解需要ntt,实在不想碰多项式乘法相关了……
据说有不需要ntt的做法,回来研究。
(待upd)

浙公网安备 33010602011771号