@SovietPower
2021-02-23T02:15:32.000000Z
字数 6931
阅读 1625
其它
图片挂了看这里。
给定一棵个点的树,每个点有一个颜色,颜色一共有种。求有多少条路径包含种颜色。
。
点分治。状压颜色。记表示状态为的路径个数。
如果当前点状态为,那么就可以从的补集以及的补集的超集更新Ans。
但是这样复杂度当然爆炸。所以直接令表示状态为及的超集的路径数。
每次合并一棵子树的状态时,枚举子树的状态,然后对于的所有子集,++。
代码见:https://www.cnblogs.com/WABoss/p/6036216.html。
还有用FWT做的社会人:https://www.cnblogs.com/Menhera/p/9514412.html, http://www.cnblogs.com/sclbgw7/p/9508235.html。
给定个数,你需要找到两个数,使得最大。输出这个最大值。
。
考虑枚举。那我们要对每个求,满足的中,乘积最大的一对。
但是还是不好求啊。这个条件其实可以削弱,即我们对每个,求为的子集,乘积最大的一对。显然不会丢失最优解。
为的子集,即同时为的子集。那么枚举的超集,求最大的两个数做就可以了。
可以用高维前缀和求,也可以对每个直接枚举子集。是复杂度有差别吧?前者是,后者是。
需要解决。可以令表示的二元组的个数,表示的的个数,那么?
显然会有重复。每个会被计算三次,所以给后两项带一个权值,让每个恰好被计算三次,就可以直接去重了。
二分答案,然后点分治(当然点分治过程中二分答案更好些)。
对于以每个点为根的子树,求是否存在边数在之间且至少存在条边权的路径。
把边权的边的权值设为,的设为,对于每种边数只需维护权值最大的路径即可。显然可以单调队列维护。但注意要先将子树按最大深度从小到大排序以保证复杂度。
复杂度。
给定长为的序列。次询问,每次给定,求。
。
莫队+RMQ:
把要求和的区间画出来。每次移动区间左右端点的时候,观察改变的会有什么。
假如原先区间是,现在左端点移动到,当前答案会加上 的。也就是固定,往右求一直到。
因为固定一个左端点,这个后缀中的只有种,所以可以枚举,假设出现在区间,然后跳到那里去,再从跳到下一个的位置,直到到达为止。
这个过程中可以累加答案,复杂度是的
从每个位置开始的第几个出现在哪,还要RMQ+二分预处理一下。总复杂度。
当然能想起Magic GCD这道题,预处理可以用单调栈,虽然复杂度还是的但显然常数小许多。
线段树:
同样把要求和的区间画出来,就很明显了。
比如设当前区间为(左端点为右端点为),要求的区间有:
以列为下标(上面分别是),当询问左端点,右端点为时,答案就是区间的和。
而每次向左移动,会在上面增加一行。而以中只有种,可以暴力算出这种以及它们对应出现的区间(还是同Magic GCD这道题),然后就可以直接区间加。
所以就是,把询问离线,按左端点从右往左处理。
复杂度。
给定一个字符串。求有多少对回文子串,满足这两对回文子串在中的位置有交集。
。
记回文子串总数为,那。
而没有交集的回文子串对数,就是。
以结尾的回文串数可以直接回文树,或是Manacher+差分求。后边的回文串数就是。把串反过来求一遍的后缀和就可以了。
因为是,回文树要用边表存转移。
给定两个长为的序列。你需要把两个序列拼成长的序列,要求原本同在或序列中的数在中的相对顺序不变。求最小的。
。
先把整个序列放在前面。然后我们每次要找的一个前缀扔到里面去,且位置不能超过上一次放的那个前缀的位置。
假设选的的前缀长度为,和为,放的位置离的末尾距离为,这一段和为。
那么当时,这么做会优。移一下项就是这段前缀的平均值更大。
而选的这段的前缀应该是平均值尽量大的。
同时序列最后是一段+一段+一段+一段...要让这些段的平均值递减。
所以我们就先把分成一些平均值递减的段,最后按平均值大小归并就可以了。。
给定一棵树及条路径。求有多少条路径满足不完全包含这条路径中的任意一条。
。
考虑求不合法的路径数。发现这些路径都是一个点在一段DFS序连续的区间中,另一个点在另一段DFS序连续的区间中。扫描线+矩阵求交即可。
复杂度。
给定一张个点条边的无向图,边权都是形如的形式()。给定,求到的最短路。
。
考虑如何改进使得能做这道题。我们把数组用线段树存成的形式。
判断时,可以像字符串一样,从高到低位在线段树上二分,找到第一个不同的位置,判断上面的大小关系。可以直接用题目给的,当然最好还是自己再写个。
每次枚举一条边修改时,一个暴力的想法是,每次只改一位,就可持久化一下,在对应位置,如果产生进位就暴力再在下一个位置。
这样复杂度是不对的,可以卡成(然而网上都是这种办法...出题人竟然数据造水了,ssfd)。
官方题解的做法是,初始建两棵全和全的线段树,进位时可以直接替换节点,这样复杂度就是真的了。
事实上那种错误的做法有人在Tutorial的comments里提到过,他也意识到是错的了。
要求在次询问内猜出一个数。每次你可以询问,交互库会返回以下两个字符之一:
1. x
,如果。
2. y
,如果
考虑询问(和),如果,显然结果是y
;,不好考虑;,结果是x
;,结果是x
。(为什么此时一定有呢...令,因为,所以。。)。
综上,如果我们依次询问,我们可以找到一个,满足。这需要次二分(最后一次不需要)。记这两个边界为,即。
考虑在中二分答案。如果,显然有;如果,同样考虑拿询问,有(还是令,如果,那么显然不对)。
这样需要二分次,那么就OK啦。
为啥都写的那么简洁啊...还是我太菜...
给定一棵个点的树。求最多可以选出多少条不相交的路径,满足这些路径含有个点。对输出答案。
。
暴力是的,即对于每个,一遍,能合并出一条个点的路径就合并,否则向上。这样贪心显然是对的(...)。
注意到答案是随增加递减的,且时,答案的取值只有这种,我们可以二分每个值是的哪个区间的答案。
需要做次,每次复杂度,总复杂度是的。
时,可以对每个暴力,复杂度。
发现两部分的复杂度并不均衡,时复杂度是,另一部分是,所以取时最优。
官方题解里有的做法...(据作者本人说)很不好写...
具体看这里叭,先不细整理惹(不仅懒得写代码,思路也懒得写惹)。https://www.cnblogs.com/jefflyy/p/9679504.html
初始ans=总点数,每有一对点相邻,就可以减少1的花费,这样先算出一个答案。
然后把不合法的去掉。网络流每跑出1的流量,就表示有一对相邻的数不合法。这就是求割。要最小化去掉相邻点对的数量,使得方案合法。
神啊qwq。https://www.cnblogs.com/Blog-of-Eden/p/7783406.html
类似切糕的拆点qwq。https://www.cnblogs.com/zbtrs/p/8608842.html
https://www.cnblogs.com/JYYHH/p/8512709.html
。
然后还有。然后就能推出:。
感觉这题应该是十分经典的叭?
套路,考虑相邻两个数(在前,在后),不交换与交换的花费是:。
(其实还可以化简下,两个都减去两个,即)
所以sort
的时候这么判下就可以惹。
似乎正确的做法应该是,先写出递推式,然后发现交换没有影响?看这里叭。
给定长为的序列,多次强制在线询问区间和。
,内存限制。
考虑个数分一块,块之间求个前缀和,内存就够用了。
可以出成交互。
有一个的矩阵,保证里面的数满足:同一行从左到右递增、同一列从上到下递增。给定一个数,你需要在次询问内确定是否在矩阵中出现过。
从右上角开始走。如果当前数,就往左走;如果,就往下走。
初始时有一个点。次操作,每次操作给某个点加两个儿子,输出此时的直径。保证每次操作后是一棵树。
。
设之前的直径是。新加入两个点,此时直径只可能是这三种。维护LCA求一下距离即可。
有个数,个限制。每个限制为:若同时选则获得价值;只选中一个不在当前限制中获得价值;都不选则获得价值。求最大价值。
。
不难,但挺好玩。
令初始答案,给每个限制的加上的权值,for
一遍所有数取正权值就行了。