[关闭]
@SovietPower 2021-02-23T02:15:32.000000Z 字数 6931 阅读 1585

某些看了但不想写代码的题

其它



图片挂了看这里

HDU.5977.Garden of Eden(点分治)


给定一棵个点的树,每个点有一个颜色,颜色一共有种。求有多少条路径包含种颜色。


点分治。状压颜色。记表示状态为的路径个数。
如果当前点状态为,那么就可以从的补集以及的补集的超集更新Ans。
但是这样复杂度当然爆炸。所以直接令表示状态为的超集的路径数。
每次合并一棵子树的状态时,枚举子树的状态,然后对于的所有子集++。
代码见:https://www.cnblogs.com/WABoss/p/6036216.html
还有用FWT做的社会人:https://www.cnblogs.com/Menhera/p/9514412.htmlhttp://www.cnblogs.com/sclbgw7/p/9508235.html


hihoCoder.1496.寻找最大值(高维前缀和)


给定个数,你需要找到两个数,使得最大。输出这个最大值。


考虑枚举。那我们要对每个求,满足中,乘积最大的一对。
但是还是不好求啊。这个条件其实可以削弱,即我们对每个,求的子集,乘积最大的一对。显然不会丢失最优解。
的子集,即同时为的子集。那么枚举的超集,求最大的两个数做就可以了。
可以用高维前缀和求,也可以对每个直接枚举子集。是复杂度有差别吧?前者是,后者是


北京八十中集训 12.20 例一.Triple(思路 计数)



需要解决。可以令表示的二元组的个数,表示的个数,那么
显然会有重复。每个会被计算三次,所以给后两项带一个权值,让每个恰好被计算三次,就可以直接去重了。


北京八十中集训 12.20 例二.Manhattan(CDQ分治)





Codeforces.150E.Freezing with Style(点分治 二分答案 单调队列)



二分答案,然后点分治(当然点分治过程中二分答案更好些)。
对于以每个点为根的子树,求是否存在边数之间且至少存在条边权的路径。
把边权的边的权值设为的设为,对于每种边数只需维护权值最大的路径即可。显然可以单调队列维护。但注意要先将子树按最大深度从小到大排序以保证复杂度。
复杂度


HDU.5381.The sum of gcd(线段树/莫队 RMQ)


给定长为的序列次询问,每次给定,求


莫队+RMQ:
把要求和的区间画出来。每次移动区间左右端点的时候,观察改变的会有什么。
假如原先区间是,现在左端点移动到,当前答案会加上 。也就是固定,往右求一直到
因为固定一个左端点这个后缀中的只有种,所以可以枚举,假设出现在区间,然后跳到那里去,再从跳到下一个的位置,直到到达为止。
这个过程中可以累加答案,复杂度是
从每个位置开始的第几个出现在哪,还要RMQ+二分预处理一下。总复杂度
当然能想起Magic GCD这道题,预处理可以用单调栈,虽然复杂度还是的但显然常数小许多。
线段树:
同样把要求和的区间画出来,就很明显了。
比如设当前区间为(左端点为右端点为),要求的区间有:

以列为下标(上面分别是),当询问左端点,右端点为时,答案就是区间的和。
而每次向左移动,会在上面增加一行。而以只有种,可以暴力算出这以及它们对应出现的区间(还是同Magic GCD这道题),然后就可以直接区间加。
所以就是,把询问离线,按左端点从右往左处理。
复杂度


Codeforces.17E.Palisection(Manacher/回文树)


给定一个字符串。求有多少对回文子串,满足这两对回文子串在中的位置有交集。


记回文子串总数为,那
而没有交集的回文子串对数,就是
结尾的回文串数可以直接回文树,或是Manacher+差分求。后边的回文串数就是。把串反过来求一遍的后缀和就可以了。
因为,回文树要用边表存转移。


牛客练习赛38 E.出题人的数组(贪心)


给定两个长为的序列。你需要把两个序列拼成长的序列,要求原本同在序列中的数在中的相对顺序不变。求最小的


先把整个序列放在前面。然后我们每次要找的一个前缀扔到里面去,且位置不能超过上一次放的那个前缀的位置。
假设选的的前缀长度为,和为,放的位置离的末尾距离为,这一段和为
那么当时,这么做会优。移一下项就是这段前缀的平均值更大。
而选的这段的前缀应该是平均值尽量大的。
同时序列最后是一段+一段+一段+一段...要让这些段的平均值递减。
所以我们就先把分成一些平均值递减的段,最后按平均值大小归并就可以了。。


牛客OI周赛7 提高组.C.小睿睿的方案(线段树)


给定一棵树及条路径。求有多少条路径满足不完全包含这条路径中的任意一条。


考虑求不合法的路径数。发现这些路径都是一个点在一段DFS序连续的区间中,另一个点在另一段DFS序连续的区间中。扫描线+矩阵求交即可。
复杂度


CF.464E.The Classic Problem(可持久化线段树 Hash)


给定一张个点条边的无向图,边权都是形如的形式()。给定,求的最短路。


考虑如何改进使得能做这道题。我们把数组用线段树存成的形式。
判断时,可以像字符串一样,从高到低位在线段树上二分,找到第一个不同的位置,判断上面的大小关系。可以直接用题目给的,当然最好还是自己再写个。
每次枚举一条边修改时,一个暴力的想法是,每次只改一位,就可持久化一下,在对应位置,如果产生进位就暴力再在下一个位置
这样复杂度是不对的,可以卡成(然而网上都是这种办法...出题人竟然数据造水了,ssfd)。
官方题解的做法是,初始建两棵全和全的线段树,进位时可以直接替换节点,这样复杂度就是真的了。
事实上那种错误的做法有人在Tutorial的comments里提到过,他也意识到是错的了。


CF.1104D.Game with modulo(交互 二分)


要求在次询问内猜出一个数。每次你可以询问,交互库会返回以下两个字符之一:
1. x,如果
2. y,如果


考虑询问),如果,显然结果是y,不好考虑;,结果是x,结果是x。(为什么此时一定有呢...令,因为,所以。。)。
综上,如果我们依次询问,我们可以找到一个,满足。这需要次二分(最后一次不需要)。记这两个边界为,即
考虑在中二分答案。如果,显然有;如果,同样考虑拿询问,有(还是令,如果,那么显然不对)。
这样需要二分次,那么就OK啦。
为啥都写的那么简洁啊...还是我太菜...


CF.1039D.You Are Given a Tree(根号分治)


给定一棵个点的树。求最多可以选出多少条不相交的路径,满足这些路径含有个点。对输出答案。


暴力是的,即对于每个一遍,能合并出一条个点的路径就合并,否则向上。这样贪心显然是对的(...)。
注意到答案是随增加递减的,且时,答案的取值只有种,我们可以二分每个值是的哪个区间的答案。
需要做次,每次复杂度,总复杂度是的。
时,可以对每个暴力,复杂度
发现两部分的复杂度并不均衡,时复杂度是,另一部分是,所以取时最优。

官方题解里有的做法...(据作者本人说)很不好写...


SRM577 Board Painting(最小割)

具体看这里叭,先不细整理惹(不仅懒得写代码,思路也懒得写惹)https://www.cnblogs.com/jefflyy/p/9679504.html
初始ans=总点数,每有一对点相邻,就可以减少1的花费,这样先算出一个答案。
然后把不合法的去掉。网络流每跑出1的流量,就表示有一对相邻的数不合法。这就是求割。要最小化去掉相邻点对的数量,使得方案合法。


SRM558 Surrounding Game(最小割)

神啊qwq。https://www.cnblogs.com/Blog-of-Eden/p/7783406.html


SRM590 Fox And City(最小割)

类似切糕的拆点qwq。https://www.cnblogs.com/zbtrs/p/8608842.html


PE512 Sums of totients of powers(欧拉函数 杜教筛)

https://www.cnblogs.com/JYYHH/p/8512709.html

然后还有。然后就能推出:


BZOJ.1727.[Usaco2006Open]The Milk Queue挤奶队列(贪心)


感觉这题应该是十分经典的叭?
套路,考虑相邻两个数在前,在后),不交换与交换的花费是:
(其实还可以化简下,两个都减去两个,即
所以sort的时候这么判下就可以惹。
似乎正确的做法应该是,先写出递推式,然后发现交换没有影响?看这里叭。


BZOJ.4216.Pig(分块)


给定长为的序列,多次强制在线询问区间和。
,内存限制

考虑个数分一块,块之间求个前缀和,内存就够用了。


某道面试题(思路)

可以出成交互。

有一个的矩阵,保证里面的数满足:同一行从左到右递增、同一列从上到下递增。给定一个数,你需要在次询问内确定是否在矩阵中出现过。

从右上角开始走。如果当前数,就往左走;如果,就往下走。


CF.379F.New Year Tree(思路)


初始时有一个点。次操作,每次操作给某个点加两个儿子,输出此时的直径。保证每次操作后是一棵树。


设之前的直径是。新加入两个点,此时直径只可能是这三种。维护LCA求一下距离即可。


牛客编程巅峰赛S2第12场. C. 共鸣问题(思路)


个数,个限制。每个限制为:若同时选则获得价值;只选中一个不在当前限制中获得价值;都不选则获得价值。求最大价值。


不难,但挺好玩。
令初始答案,给每个限制的加上的权值,for一遍所有数取正权值就行了。






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