bzoj3784 树上的路径

又是idy开的坑。感觉回去要被他吊打致残。 树分治。最开始想用二分,然后直接去每个分治点上查询。这样的总复杂度是O(n*log3n)的。不过感觉常数比较小而且绝对省代码,只用二分不用数据结构。然后发现要输出所有的边。这个算法要用容斥一样的东西来减,根本搞不定。 于是向mhy学习。使用类似noi那个超级钢琴的思路,每次把最大的一条路径找出来,然后找它的替代品。树分治后,对于每一个树上的团,算出它的dfs序。默认一个点与dfs序在它前面的区间中最深的连边。这样就可以保证不重,也比较好写。然后用堆来维护。堆中一个点需要记录的信息是这个点的答案,线段树的根,左右端点,这个点到分治团的根的距离。然后每次找出一个最大的之后把它的区间再折成两半扔回堆里就好啦。 比较神的做法。感觉我自己是想不出来的。要是考场上遇到还真会出事呢。郁闷ing。

March 27, 2015 · 1 min · laekov

bzoj2698 染色

没有五笔好烦。 无语的期望题。AC第一页最长。 首先用像借教室一样的做法去求每个位置被覆盖了多少次。然后一个下降的序列需要求导再积回来。然后发现要加回来,这个东西是不能积的。于是坑了我好久。 最后期望就是∑1-Pim。其中Pi表示第i个点被任意一个区间覆盖的概率。 水过去啦。

March 27, 2015 · 1 min · laekov

bzoj1095 [ZJOI2007]Hide 捉迷藏

迷一样的欧拉序列的题。然后似乎只有岛君的题解能看啊233。 其实就是在欧拉序列上,两点u,v之间的距离=(dfb[u], dfe[v]]之间未匹配的括号数(左开右闭)。其中dfb表示左括号的位置,dfe表示右括号的位置。 然后就是写一个线段树去维护了。写得比较丑,把所有数对都记下来了。其实只用记和跟差就行了。然后要强制如果一端是空的那么这个点就不能作为端点。完了。 然后dfs这一步越写越短了,开心hhh。 于是代码巨长还巨丑还巨慢。

March 26, 2015 · 1 min · laekov

bzoj2806 ctsc2012 Cheat

我的SAM第一题。按照惯例几乎是照着std抄的OVO。本来以为是要在SAM上DP,后来发现好像是并列的,于是比较开心。 SAM这个东西主要就是用来匹配子串用的。建法详见clj的课件,然后现在我还处于消化状态中。 SAM匹配多个串的话也比较好弄,直接在串末再加一个字符集里没有的元素就好了。 现在假设已经用SAM匹配出了第i个位置往左ml[i]个位置都是可以匹配的,那么可以二分一个答案,然后用单调队列来DP判断。写法比较简单,虽然我急着去写SAM所以这部分也是蒙过去的。 然后网上的2个std就有2种不同的答案还和我不一样。最后还是wd学长的代码靠谱orz。 现在我可以说我是写过SAM的人了哈哈。

March 25, 2015 · 1 min · laekov

bzoj3221 Codechef FEB13 Obserbing the tree树上询问

很早之前就看过的题。一直被数据范围吓到,然后感觉也比较难写所以都没写。后来发现还是挺好的。 就重链dfs序维护一下每个位置的和,然后可持久化一下就完了。然后一个常数优化是如果这个点是在这次修改的时候建的,那么就直接覆盖而不是新建点。然后跑得就比较快了。

March 23, 2015 · 1 min · laekov

bzoj3328 PYXFIB

上课讲的神题。构造公式。本来用HTML写了一堆公式的。然后天杀的网就断了要我重新开然后就没了。很想骂人。那就不写了呗,自行翻课件或者yy。

March 22, 2015 · 1 min · laekov

bzoj2700 聚会

比较基础的dp。不过因为权限的原因好像做的人不多。 首先肯定先泡便宜的茶再泡贵的茶。 然后记一下上一种茶是啥,连续泡了几次。 于是用f[i][j][k][l]表示泡了i个红茶,j个绿茶,上一种茶是k,连续泡了l次的最小花费。转移是O(1)的。然后后两个反正都要手拆开,所以干脆压下来了。 似乎很水的样子。

March 20, 2015 · 1 min · laekov

bzoj2683 简单题

水水的cdq。久了不写练一下手。然后发现犯了一堆逗错。幸好没过样例不然就do big die了。

March 20, 2015 · 1 min · laekov

bzoj2400 Spoj839 Optimal Marks

多年之前讲过的最小割。 比较好想啦。 把每一位拆开。然后单独跑一遍最小割。各种连边。然后以答案为高位,数字和为低位跑就行了。 好像也没说清楚怎么建图啊。 对于原图中已经确定的点,如果它是1,就从源连过来,否则连向汇。对于每一个未知的点,把所有边建出来。然后再向汇连个1的边来表示它如果选1的话就要产生贡献。然后就差不多了吧。脑补一下。

March 19, 2015 · 1 min · laekov

bzoj2482 Spoj1557 Can you answer these queries II

原来备案还没过。那之前是怎么成功访问的囧。 写了一晚上。教训还是之前那个,写之前要想清楚。写完再去改就很烦。自己yy了很久,虽然最初是听了mhy的一句提醒。好有危机感。 首先这个东西可以离线。之前一直在想在线怎么做然后也觉得没法做。 把询问按右端点排序之后问题就转化成了左端点在一个范围里的时候的最大子段。 然后用一个线段树表示从i到current right的时候的和,这个玩意可以直接区间加。然后再去维护这个东西的历史最大值。于是就变成了每个位置上接了一个add序列,要找它的前缀最大值。那么只需要存两个东西:当前的和以及当前的最大前缀和,就可以合并了。 然后线段树上维护两个add序列,分别是对整个线段的lazy tag of add和max value of son。就可写了。 然后好像跑得很慢啊TT。

March 19, 2015 · 1 min · laekov