@SovietPower
2019-03-11T14:26:24.000000Z
字数 5565
阅读 1729
北京八十中
任何时刻非叶节点都形成了一个...一个什么来...?
gym 100962D
hdu 5891
bzoj 3499 3115 2803
只要我们找到两条路径的公共路径,就可以通过判断他们相遇时是否在整点来得到答案了。
我们求路径上与相交的部分。令,发现如果在的子树内,那么就是与中深度较大的那个,否则就是。
同理,若在的子树内,则是与中深度较大的那个,否则是。
然后可以算出从到达公共路径(是,则可能是或)上的时间。
如果在公共路径上行走时同向(即也离更近一些),那么只需要判断是否大于等于公共路径上的最大边,如果是则答案为,否则。
如果不同向,显然首先要满足。然后我们计算两人路过公共路径的时间中点,即(若为奇数则显然不会在整点相遇)。令,然后判一下在时刻是位于还是的路径上,然后在对应路径上倍增即可。
EC-Final E
边权只有,这其实和边权为是等价的。也就是去算边权为的边用了多少条,边权为的边用了多少条...设只考虑边权为的边用了条,只考虑边权为的边一共用了条,那么边权为的边就用了条。
其实可以这样算:枚举边权,将所有边权的边加入图中,若成功加入了条边(要构造一棵树,可以直接并查集维护),设当前图的点数为,则边权的边一共用了条。令它们贡献为,即+=。
这样从枚举到,那边权为的边就会被算次,边权为的边会被算次...每一次的贡献都是直接加,不需要考虑边权。
对于当前要加入的边,我们维护一个大小为的并查集,计算每一层成功加入了多少条边。
对于最初的两层点,只需要并查集维护一下就可以了。考虑第二层与第三层点的连通性与前两层有什么不同,显然在之前连通的点现在还是能连通(加入的边都是一样的),区别就是,第二层的点之间可能在之前连通了。
所以我们可以保留之前的并查集,对于在第二层右侧连通的点对,在第三层左侧加入一条边。原本的边就不需要保留了。
同样在第三层继续加边的时候会出现两种情况:不连通,合并;已连通,这意味着和上一层相比我们可以少加一条边,令增量--。
同样对于在右侧连通的点对,再在第四层左侧加入边。
当做到某一层没有要加入的边时,答案就不会改变了。
所以我们就可以计算出每一层成功加入边数的增量的增量(即求一遍前缀和后我们可以得到每一层之间相差多少),这是个二阶差分,所以求两遍前缀和就可以得到每一层成功加入的边数了。
枚举边权做遍即可。
因为连通性至多改变次?所以复杂度是对的,为。
时,。
对于一段相同的数,我们只需要保留最靠前的(单增)。
可以直接用两个单调栈,如果一段数的相同,我们维护此时最靠前的。
有用的状态只有当前单调栈里的元素,所以二分满足的位置时,直接在存值的单调栈里二分位置就可以了。
查询就维护一棵线段树,然后在单调栈里对应的区间查询。
复杂度。
如果存在且,那么送的时候也一定可以把顺便送走。所以可以删掉这样的,然后序列的就是单减,即,就可以直接单调队列维护了。
复杂度。
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
假设我们当前要处理的区间是上面这样的。那么我们要找出其中的所有极长颜色段,也就是。因为在该区间中我们能染这三种颜色,剩下的只需要递归到每个极长区间内部去做就行了。
那我们现在要算怎么染这三段()颜色使得贡献最大。
把这三段颜色拿出来记为,每一段的价值分别是这一段的长度。
令表示合并到段的最大贡献,答案就是。
合并显然就是个区间DP:,其中是价值的前缀和。这样复杂度是的。
容易想到每次染色一定是染左右两边的,所以实际不需要枚举中间点,直接就可以了。这样就是了。
令表示从出发到期望最短时间,则
在最优策略下,只有能使变小,才会走到。也是指会走到多少个。
但是我们不知道是哪些能转移到,所以的时候判一下是否能使变小就可以了。
中当前出队的点的肯定已经是更新完了。
23:30 G
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就是;否则在同侧,可以考虑递归到两边去做。
能够想到的是,局部最优决策下的概率比等于全局最优决策下的概率比。也就是说令左边子区间在最优决策下,各位置的概率比为,那么在于右区间合并,也就是在全局中,左区间各位置的概率比仍为。
这个结论不难证明,当同在左区间中的时候,答案是和右区间无关的(否则有一个在右区间的话,答案和有关,等会再讨论)。
所以我们可以分治去做,最后合并左右两区间,也就是在的异侧的时候。
设左区间的答案为,整体分到的概率是,右区间的答案是,整体分到的概率就是。
假如后手选择在左区间,那么在右区间时先手的收益是;在右区间,收益就是。
先手会令这两个式子相等,所以我们能解出,然后代到左式或右式就能得到当前区间的答案了。
分治复杂度,建的复杂度。
54:30 K