这题乍一看很想树上莫队、也很像树形dp,也感觉要用树链剖分,树上差分
但又好像不大对——
莫队的话、单点查询就和暴力无异、、 树形dp状态冗杂。 链剖lca多个点不好差分、、
链剖+set好像会超时、
打了一个,但网上没有评测、、、
极限情况(一条链+所有m在最后一个点上 ..)应该是o(mn)的 10^10、、、数据不坑的话60分还是有的、
有空再想想吧、
恩,先分析一下题目,这个m的总数虽然很大,但颜色种类数是<=100000我们或许可以从种类数做处理。
而且我们可以注意到颜色输入时,顺序是无所谓的,或许我们可以离散化一下离线处理。
这样我们就可以求lca差分了 。 但如果是裸的lca的话,每一个颜色相同的点必须和其他颜色相同的点求lca,对于完全树,效率是满意的 10^7 ,但如果是极限情况,效率就变成了 10^10(和上面一样) 感觉差分判终点的lca应该有很多重复计算的地方。
诶,既然一种颜色重复的只算一次的话,为什么不打bool+树状数组?
而且 它每个点的颜色只会对它上面的节点造成影响,从某种程度上说这或许是单调的,或许我们在剖分之后扫的时候每个重链可以新建一个set记录一下,这样对于极限情况反而会更快,但这样的话效率取决于重链的个数及深度,要是很多重链来回跳的话效率会很低:
就像这样:
不稳定的果断弃;
好了,感觉所有的路都封死了,基本没有办法了
来看题解:
好吧,离正解很近了,但倒在门口了、、
其实第一点我完全想到了,但第二点我只想到第一句话、、
其实我在做的时候也想过为每对点找lca做优化,但实在没有想到dfs序,转而用链剖,但对于此题来说,链剖的lca、更新性质不如dfs序lca、更新性质。。
就是说dfs序相近的求出的lca一定是最小的lca、、
确实,,离线lca的本质就是区间缩得越小,lca越小、、
这样的话就可以o(nlog(n))求lca了
复杂度就降为了 5000000左右、很轻松的就能过了
总结:
知道了题目的特性剩下的最重要的就是选性质最契合的工具了,看来不能抓住一个看似不错的算法不放,有可能另一种做法更好、
而且思考要多角度,要相信正解是人可以想出来的