随笔分类 -  二分答案

摘要:对作文库中的串建出广义SAM,然后显然可以二分答案,二分之后考虑暴力dp,设f[i]为前i位最长匹配长度,显然有f[i]=max(f[i-1],f[j]+i-j) (i-j>=l&&j+1~i能在作文库中匹配)。在SAM上跑并记录匹配长度,单调队列优化dp即可。 阅读全文
posted @ 2019-05-08 01:22 Gloid 阅读(187) 评论(0) 推荐(0)
摘要:考虑第一问的部分分。显然设f[i]为i子树从根开始扩展的所需步数,考虑根节点的扩展顺序,显然应该按儿子子树所需步数从大到小进行扩展,将其排序即可。 要做到n=3e5,考虑换根dp。计算某点答案时先将其在父亲中的贡献去掉,然后用和之前同样的方法做即可。冷静一下也没什么复杂的。 第二问注意到两个点扩展出 阅读全文
posted @ 2019-02-14 22:59 Gloid 阅读(227) 评论(0) 推荐(0)
摘要:题面甚至没给范围,由数据可得n<=200。容易想到二分答案,暴力枚举某集合的价值,2-SATcheck一下即可。这样是O(n4logn)的。 2-SAT复杂度已经是下界,考虑如何优化枚举。稍微改一下,不妨从大到小枚举较大的集合价值(即枚举边),另一个集合二分答案,同样O(n4logn)。 看起来没什 阅读全文
posted @ 2019-01-02 00:32 Gloid 阅读(265) 评论(0) 推荐(0)
摘要:二分答案后得到每个位置需要被加的次数。考虑贪心。从左到右考虑每个位置,将以该位置为左端点的区间按右端点从大到小加进堆。看该位置还需要被加多少次,如果不需要加了就不管,否则取堆顶区间将其选择,BIT实现区间覆盖。 阅读全文
posted @ 2018-12-06 13:10 Gloid 阅读(154) 评论(0) 推荐(0)
摘要:首先二分答案简化一下问题,现在只有0和1了,要求最后剩下的是1。再简化一下考虑没有已固定的位置怎么做。考虑每个位置由其合并到的位置连边,显然这样形成了一棵三叉树。设f[i]为使得某位置为1其子树至少要放多少个1即可,转移显然。加上已固定位置也类似,修改dp初值即可。 阅读全文
posted @ 2018-12-02 23:14 Gloid 阅读(270) 评论(0) 推荐(0)
摘要:如果要在某点买入某物品并在另一点卖出,肯定是走其间最短路径。于是预处理任意两点间的收益和最短路径,连完边二分答案判负环即可,可以全程floyd。注意inf大小。 阅读全文
posted @ 2018-11-30 02:35 Gloid 阅读(137) 评论(0) 推荐(0)
摘要:显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的。枚举中间位置二分答案,哈希判断即可。注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符。 阅读全文
posted @ 2018-11-14 19:45 Gloid 阅读(211) 评论(0) 推荐(0)
摘要:看到比值先二分答案。于是转化成一个非常裸的树形背包。直接暴力背包的话复杂度就是O(n2),因为相当于在lca处枚举每个点对。这里使用一种更通用的dfs序优化树形背包写法。https://www.cnblogs.com/zzqsblog/p/5537440.html 即设f[i][j]为在dfs序第i 阅读全文
posted @ 2018-11-08 16:13 Gloid 阅读(214) 评论(0) 推荐(0)
摘要:二分答案,分别往尽量小的和尽量大的二分即可。 阅读全文
posted @ 2018-11-03 09:45 Gloid 阅读(162) 评论(0) 推荐(0)
摘要:看到这个式子当然先二分答案。得max-min-(j-i+k)ans>=0。 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界。那么实际上我们根本不用管端点是否真的是max或min,因为即使不是将他们计入也不会对最终答案造成影响。不妨设右端点是max,则要最大化aj 阅读全文
posted @ 2018-10-30 21:28 Gloid 阅读(165) 评论(0) 推荐(0)
摘要:注意到答案一定是原串的子串,于是考虑造出SA,二分答案是第几小的子串。第k小子串很容易在SA上求出。之后计算使他成为最大子串至少要在几个位置切割,对每个字典序比答案大的后缀,找到所有合法切割位置(求lcp即可),就转化成了选最少的点使每个区间都包含至少一个点的经典问题。 阅读全文
posted @ 2018-10-25 00:19 Gloid 阅读(357) 评论(0) 推荐(0)
摘要:容易想到二分答案。问题变为判断是否所有条件都被满足,可以发现这是很多变量间的相对关系,取个log之后就是经典的差分约束模型了。特殊的地方在于某些人的分数已被给定,从每个人开始跑一遍最短路判断一下是否能满足关系即可。 阅读全文
posted @ 2018-10-09 20:46 Gloid 阅读(256) 评论(0) 推荐(0)
摘要:不明白在某谷上是怎么标到紫的。二分答案或者发现答案就是最大逆序差的一半。 阅读全文
posted @ 2018-09-27 12:24 Gloid 阅读(98) 评论(0) 推荐(0)
摘要:因为不会SAM,考虑SA。将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法。 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了。这是一个主席树的经典问题,对每个数找到上次出现位置扔进去即可。这样就做到O(nlog2n)了。 可以进一 阅读全文
posted @ 2018-09-23 19:05 Gloid 阅读(264) 评论(0) 推荐(0)
摘要:由数据范围容易想到网络流。由于操作只是对于棋盘上相邻两格,容易想到给其黑白染色。 假设已经知道最后要变成什么数。那么给黑白点之间连边,其流量则表示同时增加的次数,再用源汇给其限流为需要增加的数即可。 考虑最后应该变成什么数。 如果棋盘中黑白格子数量不同,设最后变成的数是x,则x*黑格数量-黑格数字和 阅读全文
posted @ 2018-09-09 20:21 Gloid 阅读(150) 评论(0) 推荐(0)
摘要:先不考虑只有一个显得有些特殊的天兵。 可以发现超能力的作用实质上是使兵更换职业。每一个兵到达某个位置最少需要更换职业的次数是彼此独立的,因为如果需要某两人互换职业可以使他们各自以当前职业到达需要到的地方,不会造成其中一个次数增加。 于是预处理出每个兵到达每个位置的最少代价。之后二分答案,把每个兵向可 阅读全文
posted @ 2018-09-04 22:21 Gloid 阅读(330) 评论(0) 推荐(0)
摘要:与中位数有关的题二分答案是很常用的trick。二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0。 由于每个位置是1还是-1并不固定,似乎不是很好算。考虑暴力一点的想法:对于每一种答案预处理。这样查询就很好办了,线段树上每个区间维护最大前缀和后缀和及总 阅读全文
posted @ 2018-09-03 16:06 Gloid 阅读(112) 评论(0) 推荐(0)
摘要:相邻数作差后容易转化成将这些数最多再切m刀能获得的最小偏差值。大胆猜想化一波式子可以发现将一个数平均分是最优的。并且划分次数越多能获得的偏差值增量越小。那么就可以贪心了:将所有差扔进堆里,每次取出增量最大的。 因为m非常大这样还是不行。考虑二分我们所获得的最小偏差值增量。可以解解方程计算出一个数在该 阅读全文
posted @ 2018-08-29 09:56 Gloid 阅读(121) 评论(0) 推荐(0)
摘要:要求最大值最小容易想到二分答案。首先对每个点求出子树中与其最远的距离是多少,二分答案后就可以标记上一些必须在所选择路径中的点,并且这些点是不应存在祖先关系的。那么如果剩下的点数量>=3,显然该答案不可行;=0,显然可行;=1,由该点沿其到根的路径往上爬,并计算最远距离判断是否合法;=2,求出两点lc 阅读全文
posted @ 2018-08-27 22:01 Gloid 阅读(186) 评论(0) 推荐(0)
摘要:某两个点间的请求只对不在这条路径上的询问有影响。那么容易想到每次修改除该路径上的所有点的答案。对每个点建个两个堆,其中一个用来删除,线段树维护即可。由于一条路径在树剖后的dfs序中是log个区间,所以其补集也是log个区间。 然而由于复杂度是O(nlog3n)的以及蒟蒻自带大常数,在luogu上T了 阅读全文
posted @ 2018-08-16 01:51 Gloid 阅读(158) 评论(0) 推荐(0)