【CSP-S2019模拟】【Comet OJ 模拟赛Day2T3】11.10比赛总结
最后几套模拟赛了
比赛思路
- T1(赛博朋克酒保行动):随便算一算
- T2(模拟旅行):刚开始觉得这题很神仙。但是数据那么大,肯定是直接最短路的。所以不妨思考一下怎么直接最短路。然后我想到直接以每一个关键点作为起点,一起最短路。但是可能会有自己到自己的情况。那么再记一个次短路不就好了(上了发SPFA)。
- T3(迷雾华光):离线不是裸的树上莫队吗。
赛后消化
- T2SPFA能获得0-20分不等的好成绩。众所周知,SPFA是O(nm)的算法。
- 改成Dij啊啊啊啊啊(在线学习Dij)
- T3对于序列问题可以直接分块。同理,对于树上问题也可以树分块(裸题??)
- T3还是比较难打的。
Comet OJ 模拟赛 Day2
- 没有打(真香)
- 主要记录一下T3。
- 题意就是在一颗树上每一次修改一个节点的二进制状态,求与它and为0的相邻节点的个数。
- 首先只用记录每一个点的儿子的贡献。改的时候处理父亲。
- O(2m)修改,O(1)查询
- 或O(2m)查询,O(1)修改。
- 平衡规划一下。改成O(2m/2)修改,O(2m/2)查询。
- 对于一个状态,修改时前一半转移到它的父亲集合,后一半保留在原地。查询时前一半保留,后一半找它的子集。
- 注意到如果儿子个数很少的话,其实是不如直接暴力的。对于d<=2m/2的暴力。
- 这样就可以解决空间的问题。
- 时间空间O(n*2m/2)
总结
- 这辈子再也不打SPFA了(能dij为什么要SPFA)。
- 分块的题目我还是很少直接想出来。。。