ECNU的oj,题很多的样子。。。orz
附上一篇讲树上差分很不错的blog
初学树上差分第一题吧算是,简单的分析一下就可以发现只需要求出来各条边在query中被覆盖到的次数就可以了。利用边的树上差分很容易就能求出来。每次求出lca之后分为两条链,则cf[u]++,cf[v]++,cf[lca]-=2;即可处理完毕。最后推的时候用dfs从下往上推就可以了。
继续阅读“[LCA][树上差分] ECNU OJ 3631 Delivery Service”
ECNU的oj,题很多的样子。。。orz
附上一篇讲树上差分很不错的blog
初学树上差分第一题吧算是,简单的分析一下就可以发现只需要求出来各条边在query中被覆盖到的次数就可以了。利用边的树上差分很容易就能求出来。每次求出lca之后分为两条链,则cf[u]++,cf[v]++,cf[lca]-=2;即可处理完毕。最后推的时候用dfs从下往上推就可以了。
继续阅读“[LCA][树上差分] ECNU OJ 3631 Delivery Service”
http://codeforces.com/contest/1064/problem/D
这个题最操蛋的是我把复杂度弄错了导致没有敢写暴力。。不过官方并没有出题解所以我也不知道我的做法是否可行,只能说通过了目前的所有数据。
做的思路就是求出来原点到每个点所用的最小的left和最小的right,求的方法就是暴力bfs,但是这里有个问题是有可能会有一个点可以通过多条路径到达,那么该如何确定最小值?如果直接裸搜不打标记会使得无限循环,如果打标记则会使得多种可能没有考虑,我这里用了一个玄学剪枝就是当当前点的下一个点的数据有被更新的时候才加到queue里,否则就不加,可以保证去掉了很多无用的扩展也可以保证搜索可以结束。另外一个优化是加了点是否已经在queue内的判断,可以避免多余的入队操作(这个貌似也可以用在一般的dij里啊)
http://codeforces.com/contest/1064/problem/E
又是喜闻乐见的交互+二分,这个已经在cf的讨论区被吐槽两次了,每次出交互题都是二分。。。我一开始没有搞懂题意,以为是你随便给他出点它会自动调整让点可以分为两片区域,后来才意识到他是给定了点的颜色分布,就是第几个点你只要问就是安排好的,也就是说这个需要你掌握问的点的坐标。。。
但是在不知道下一个点是什么的时候如何发问呢,首先想简化的过程,如果问的点全在一条线上会发生什么:假设左边为白点右边为黑,那么那个分界线一定是先往一个方向走了几步,然后又得回头往另一个方向走,如此反复。那么如何保证每次“回头”都可以有足够的余地让继续走下去而不与之前定好的界限相交?想到了一个叫二分的东西。。在倍增法的实现里其实就可以发现,他每次都会减半所以每次都不会覆盖到原来的部分。
但是这个题目直接二分又是有问题的,因为最多可以有30个点,而[log2(1e9)]==29,也就是说有一种情况可能最后会有俩点重合,为了避免这种情况可以先ask一个(0,0),并且以此确定左半边的颜色,而不是像一开始说的一样自己定左右颜色。这样的话就剩下了29个点需要处理了,1e9的范围可以保证无论如何二分都可以达到没有任何两个点重合的结果。这样的话只需要在分界处的两个点之间画一条斜线就可以了。
因为这个29的坑wa了n发。。。
继续阅读“[二分][精度][思维] codeforces1064E Dwarves, Hats and Extrasensory Abilities”