2017.3.9 Harry and Christmas tree 失败总结

来源:互联网 发布:机器码算注册码软件 编辑:程序博客网 时间:2024/05/16 09:52

          这题乍一看很想树上莫队、也很像树形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左右、很轻松的就能过了


总结:

知道了题目的特性剩下的最重要的就是选性质最契合的工具了,看来不能抓住一个看似不错的算法不放,有可能另一种做法更好、

而且思考要多角度,要相信正解是人可以想出来的


        

0 0
原创粉丝点击