2022.07.24 NOI模拟赛总结

1.时间安排

7:30~7:45

T1:图上路径计数,有30分可以暴力拓扑,还有30分内向森林。

T2:排列组合计数,应该是数学题,有30分暴搜,还有30分n=2000可能是n^2做法。

T3:数据结构题,树上路径取反,查询某点所在连通块大小,10分暴力,有20分链可以线段树上二分,有30分只取反一条边应该可以lct。

7:45~8:10

写了T1的30分暴力拓扑。

内向森林可以放在虚树上做,但一时间忘了虚树怎么写,先放着。

8:10~8:40

写了T2的30分暴搜。

试着推一推容斥,弄出来了一个图,但是仍然不会处理重复计数的情况。

8:40~10:20

写了T3的10分暴力,本来写线段树上二分,懒得讨论细节了直接二分+线段树,反正两个log肯定能过。

从9:00开始码lct,在9:30左右码完,突然意识到这题要求的是子树操作,需要子树加或子树覆盖,lct只作过一题还是个巨麻烦的分讨题,试着按照虚实子树的套路拆分贡献,但是一直到10:00也没调出来,放弃了lct的思路。

因为不强制在线,就想了想离线的算法,思路比较乱,没想出来什么。

10:20~11:00

拐回头想T1,发现实际上不用虚树,把所有点按森林中的深度排序即可,对拍没问题。

想把这个做法推广到正解,试着建“虚图”这类的,但是边数可能是 \(O(m)\) 级别的,做不了。

又空想了很久,没什么结果。

11:00~12:00

突然发现T3就是线段树分治的板子题,按每个边存在的时间加入后用可撤销并查集维护,对拍没问题。

想了想怎么推广到一般路径,但这显然不可能。

又试着调了调lct,毕竟lct能维护路径的虚实变化,但是还是没调出来。

12:00~12:30

开摆,饿饿,饭饭。

result:

T1:60 T2:0(数组开小=俯卧撑*10/kk) T3:60

2.总结

如果数组没开小就rk2了/kk

T1:

J神和丁神场切%%%

学到了新的技巧(可能以前见过?但是没写过):图论分块(实际上就是按点的度数根号分治)。

正解就是类似的把虚树拓展到图上,但是更新是有技巧的。

先把点按度数是否大于 \(\sqrt m\)(\(m\)是点总度数/边数)分类,大于的那部分称为重点,其他的称为轻点。

容易证明重点的数量不超过 \(\sqrt m\)

把询问点按照拓扑序从小到大排序,保证答案更新的顺序。

每个点都要去更新出边集合中的重点。

这样计算答案是,如果这个点是重点,他的答案已经更新好了,直接统计,对于轻点,由于度数不超过 \(\sqrt m\),直接暴力遍历入边即可。

总复杂度是 \(q\sqrt m\) 的。

这种根号分治的思想体现在平衡更新点和更新答案的复杂度,从 \(O(m)\) 更新点 \(O(1)\) 更新答案平衡为都是 \(O(\sqrt m)\)

感觉可以利用这种根号分治做很多图上统计问题。

T2:

谁能想到这是轮廓线DP,太神了。

60分做法(数据范围: \(n\) 2000,\(w_i\) 2000, \(m\) 3):

可以把每个数拆解成 \(z2^x3^y\),把 \(z\) 相同的归为同一类,这些类之间互不干扰,答案可以直接乘法原理。

考虑同一类的合法方案数,可以把每个数看做一个点 \((x, y)\) ,题目中的要求相当于 \((x, y), (x+1, y), (x, y+1)\) 同时被标记的话颜色不能相同。

直接轮廓线DP即可,只需要维护当前轮廓最下面的一行即可(不必维护左插头)。

\(x\) 上界是12,\(y\) 上界是6,时间复杂度是 \(O(类的数量*12*6*4^6)\),但实际根本卡不满,而且随着 \(z\) 的增加 \(x,y\) 很小很小,类的数量大概是质数个数级别甚至更小。

细节很多,调了1个多小时,看来还是不够熟练。

正解还没懂。

(待upd)

T3:

L神写了lct不过场上挂了,赛后订出来了,具体的话就是分别维护虚实子树的贡献,我的push_up函数存在很多细节问题,lct维护子树还是做的少。

J神写了操作分块,开O(2)过了,具体的话就是每 \(\sqrt m\) 个询问建一个虚树,在虚树上暴力做,整体的复杂度就是 \(O(m\sqrt m)\)(340行重工业%%%)

正解还没懂。

(待upd)

posted @ 2022-07-24 16:54  Displace  阅读(36)  评论(0)    收藏  举报