[关闭]
@SovietPower 2019-03-11T14:26:24.000000Z 字数 5565 阅读 1688

北京八十中

北京八十中



Day1 PM

任何时刻非叶节点都形成了一个...一个什么来...?

gym 100962D
hdu 5891
bzoj 3499 3115 2803


Tests

Day2 tvt(倍增)

只要我们找到两条路径的公共路径,就可以通过判断他们相遇时是否在整点来得到答案了。
我们求路径上与相交的部分。令,发现如果的子树内,那么就是中深度较大的那个,否则就是
同理,若的子树内,则中深度较大的那个,否则
然后可以算出从到达公共路径(则可能是)上的时间
如果在公共路径上行走时同向(即也离更近一些),那么只需要判断是否大于等于公共路径上的最大边,如果是则答案为,否则
如果不同向,显然首先要满足。然后我们计算两人路过公共路径的时间中点,即(若为奇数则显然不会在整点相遇)。令,然后判一下在时刻是位于还是的路径上,然后在对应路径上倍增即可。

Day3 a

EC-Final E

Day3 c(思路 并查集)

https://www.bilibili.com/video/av38542305 A

边权只有,这其实和边权为是等价的。也就是去算边权为的边用了多少条,边权为的边用了多少条...设只考虑边权为的边用了条,只考虑边权为的边一共用了条,那么边权为的边就用了条。
其实可以这样算:枚举边权,将所有边权的边加入图中,若成功加入了条边(要构造一棵树,可以直接并查集维护),设当前图的点数为,则边权的边一共用了条。令它们贡献为,即+=
这样枚举到,那边权为的边就会被算次,边权为的边会被算次...每一次的贡献都是直接加,不需要考虑边权。
对于当前要加入的边,我们维护一个大小为的并查集,计算每一层成功加入了多少条边。
对于最初的两层点,只需要并查集维护一下就可以了。考虑第二层与第三层点的连通性与前两层有什么不同,显然在之前连通的点现在还是能连通(加入的边都是一样的),区别就是,第二层的点之间可能在之前连通了。
所以我们可以保留之前的并查集,对于在第二层右侧连通的点对,在第三层左侧加入一条边。原本的边就不需要保留了。
同样在第三层继续加边的时候会出现两种情况:不连通,合并已连通,这意味着和上一层相比我们可以少加一条边,令增量--。
同样对于在右侧连通的点对,再在第四层左侧加入边
当做到某一层没有要加入的边时,答案就不会改变了。
所以我们就可以计算出每一层成功加入边数的增量的增量(即求一遍前缀和后我们可以得到每一层之间相差多少),这是个二阶差分,所以求两遍前缀和就可以得到每一层成功加入的边数了。
枚举边权遍即可。
因为连通性至多改变次?所以复杂度是对的,为

Day5 yjqa(DP 线段树 单调栈)

时,
对于一段相同的数,我们只需要保留最靠前的单增)。
可以直接用两个单调栈,如果一段数的相同,我们维护此时最靠前的
有用的状态只有当前单调栈里的元素,所以二分满足的位置时,直接在存值的单调栈里二分位置就可以了。
查询就维护一棵线段树,然后在单调栈里对应的区间查询。
复杂度

如果存在,那么送的时候也一定可以把顺便送走。所以可以删掉这样的,然后序列的就是单减,即,就可以直接单调队列维护了。
复杂度

Day5 yjab(DP Splay)

https://www.cnblogs.com/Jessie-/p/10211995.html

Day7 yjqaa(数位DP)

https://ac.nowcoder.com/acm/contest/296/D
https://www.cnblogs.com/SovietPower/p/10227151.html



(下标是从高位往低位,依次是
比如对于这两个数,先找到最高的满足的一位,显然我们还要找比高的最近的一位,满足第
然后我们要将之后的位上的全变成,然后-=,才能使得这一位为。这样的第位变为,之后全变为,显然此时还需要的代价就是
而之前的代价就是 。再算上及前位的代价,记的二进制表示中的个数,变成的总代价其实就是
这样就可以数位DP了。
表示 当前考虑到第位,最近的满足的位是,是否处于上界,是否已经大于(要保证),是否已统计过答案(只在最高的那位统计答案),此时的总答案。
同样还需要记表示方案数,用来统计答案。
转移时枚举当前位填什么就行了。
状态数代码在这儿


也有的解法(我用记搜写了下,代码在这儿):
orz 的题解后,发现这一维很容易就省去了...
原本记是为了计算这部分贡献,放到代码中就是+=是方案数)。
现在我们只记是否出现过(状态是三进制,分别表示未出现、出现过还没出现都出现了),如果出现过,转移的时候就+=
这样对于的贡献还是会算次。
这样复杂度就是了。


解释一下的代码。。
写的从低位往高位的递推,每次枚举当前要计算的位,然后枚举是上界,是那个三进制),据此枚举(要满足这个状态)第还是
因为是从低位往高位(要注意转移对状态),所以是说还没有找到是指找到了但没有确定是指都已经确定了。
那么看转移,这维和记搜写法是一样的...(其实哪一维和记搜都差不多)。
下面忽略这一维,只考虑。为了不混用,下面的就是最上面变成这一过程中的,代价还是
可以转移。但要从转移就是令第位为,也就是需满足,此时既可以也可以从转移。
可以转移。同理要从转移就是令第位为,也就是要满足,且此时只能从转移。
上面两个转移虽然形式像但是不同。
只能从转移。
时,也就是还没出现,此时+=,这样就能统计这个答案了(后面n-u位中,算每位的时候答案都加上一个当前的方案数g',合起来就是那个(n-u)*g)。

可能还会不懂...我再写一下:
假设有三位,现在考虑第位,本来是在这里加是填及后面的位的方案数,就等于,所以就是
所以你在统计一次,每个那统计一次,就是
再扩展几位也是这样。

还不懂的话看代码吧...感觉说不太清楚啊QAQ

Day8 color(区间DP 贪心)


假设我们当前要处理的区间是上面这样的。那么我们要找出其中的所有极长颜色段,也就是。因为在该区间中我们能染这三种颜色,剩下的只需要递归到每个极长区间内部去做就行了。
那我们现在要算怎么染这三段()颜色使得贡献最大。
把这三段颜色拿出来记为,每一段的价值分别是这一段的长度。
表示合并段的最大贡献,答案就是
合并显然就是个区间DP:,其中是价值的前缀和。这样复杂度是的。
容易想到每次染色一定是染左右两边的,所以实际不需要枚举中间点,直接就可以了。这样就是了。

Day8 path(期望 递推 Dijkstra)

表示从出发到期望最短时间,则

在最优策略下,只有能使变小,才会走到也是指会走到多少个
但是我们不知道是哪些能转移到,所以的时候判一下是否能使变小就可以了。
中当前出队的点的肯定已经是更新完了。

Day9 aa

23:30 G

Day9 bb(后缀数组/后缀自动机 零和博弈)

https://www.bilibili.com/video/av38542305 44:28 J
https://www.cnblogs.com/SovietPower/p/10269997.html


题面在这儿(或者去牛客 EC-Final J上看)。
简要题意:给定一个长为的字符串,记为从开始的后缀。
两个人进行博弈,先手任意确定一个概率序列。后手确定一个后缀。先手想要最大化下式的值,后手想要最小化下式的值,两人按照最优策略决定,求最后下式的值:

多组数据,


一个最大化一个最小化,可以看做先手的收益是,后手的收益是,所以这就是一个零和博弈,答案会在纳什均衡点处取到。即第一个人选择一种混合策略,使得自己在最坏情况下收益最大,也就是对面不管怎么决策,收益都一样。
SAM:
大概就是找出后缀树上的后缀节点,然后令它们的收益相同,从而解出各个位置的和收益。(然而我不知道用SAM怎么标记后缀节点QAQ)
复杂度

(随便记的忽略下面这一段吧)


求出这个的,然后令,求,算出来的就是原方程的

SA:
我们知道排名在中的后缀的LCP是,设最小值的位置是,如果当前的两个后缀的两边,那么此时的LCP就是;否则在同侧,可以考虑递归到两边去做。
能够想到的是,局部最优决策下的概率比等于全局最优决策下的概率比。也就是说令左边子区间在最优决策下,各位置的概率比为,那么在于右区间合并,也就是在全局中,左区间各位置的概率比仍为
这个结论不难证明,当同在左区间中的时候,答案是和右区间无关的(否则有一个在右区间的话,答案和有关,等会再讨论)。
所以我们可以分治去做,最后合并左右两区间,也就是的异侧的时候。
设左区间的答案为,整体分到的概率是,右区间的答案是,整体分到的概率就是
假如后手选择在左区间,那么在右区间时先手的收益是在右区间,收益就是
先手会令这两个式子相等,所以我们能解出,然后代到左式或右式就能得到当前区间的答案了。
分治复杂度,建的复杂度

Day9 cc

54:30 K




添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注