@SovietPower
2021-09-14T21:03:01.000000Z
字数 7812
阅读 1283
ACM
ZJOI2012 波浪、Fountains(ICPC 2020 Shanghai)、String Transformation(CF 1383 C)(...看ppt吧)
https://blog.csdn.net/Johnny817/article/details/102979270
https://blog.csdn.net/sz_165394732/article/details/102979948
一个简单的做法是枚举每个数,DP时维护、的数位各有多少个。复杂度是。
观察一下的形式,比如:,可以发现数位的贡献是,数位的贡献是...也就是的贡献是,其中是的数位个数。
所以DP时只需要维护的数位有多少个,求出方案数后乘就是贡献。
这样复杂度。
https://www.cnblogs.com/reverymoon/p/14153891.html
数的价值定义为:十进制表示中第位为则该位价值为,该位为价值为,为价值为,否则为,然后所有位上价值相加。
给定。次询问,每次询问给定,求满足个数的和为情况下,这个数的最大价值和。
。
假如个数的所有位上只有,那么每一位都可以看作 总数为、体积为、价值为的物品,就是个物品、容量为的多重背包。
那么考虑怎么让尽可能多的数位上是。
求和时每位是独立的,对于某一位,如果有两个数该位分别是而不是,则若,那么可以将换成;否则则可以将换成。
所以对于每一位,可以满足最优情况下只有一个数该位不为。将这些不为的位放到一个数上,就满足个数的所有位上为,剩下一个数任意。
像最上面一样,对每位个物品做二进制优化多重背包,然后加上剩下的一个数就ok。
复杂度。
细节:预处理一下,先把单独的那个数价值求出来,再做背包。
给一棵个点的树,每个点有体积和价值,求总容量分别为时选出一个最大价值独立集(相邻节点不能同时选)的方案数。
。
还是先考虑最简单的,表示当前为点,已选体积,选/不选的方案数。树上背包复杂度。
考虑用DFS序优化树形背包。问题在于 DFS序从到时,这个点可能先向上走很多步到,然后再向下到,所以需要记录的状态才能知道选没选。同理,DP时要记一个点到根节点路径上所有点的状态,状态数就成了。
优化是,用重链剖分来求DFS序,先DFS轻儿子再走重儿子。这样到需要向上跳时,会跳过所在的一整条重链(走一条轻边到所在重链),对我们只需记的状态。
同理,只需对每一条轻边记点的状态,一共要记当前点到根节点路径上个点的状态,状态数为。
复杂度。
细节:先把所有点要记的所有求出来(记为)。转移时,先枚举求出的状态,然后再枚举选不选更新即可。
给定平面上个不同的点,求一个排列,使得,依次相连构成的角为锐角。无解输出-1。
。
连边和判断锐角,考虑大角对大边,只需要让不是最长边即可。所以直接令,即每次向最远的点连边,一定可以满足不是最长边,这样一定有解。
给定个二元组,求两个排列,使得,并最大化。
。
把限制看成边。题意可以化为:给一个无向图,给边定向,使存在两个拓扑序且的点尽量少。(感觉也很抽象,对我没什么用)
考虑什么时候点一定有:和其它所有点相连的点肯定是。所以先将度数为的点删掉。
然后每个点至少和一个点没有连边。考虑一个点和一个点集(),满足与中所有点无连边(即与大小关系任意),那么取显然可以使合法。
那如果能将图划分成若干个的结构,因为每个内部编号连续,之间的大小关系就不会改变,那么就找到解了。
那我们就模拟这个过程。称上面的与无连边的为关键点。
对于一个尚未考虑的,任取与无连边的点记为。
可以发现这个构造只需满足“对任意点存在一个和它没有连边的点”,且最终每个点都属于一个结构且每个结构有一个关键点和。所以一定有解使所有满足。
用set
维护,复杂度。或者unordered_map
可以。(不过找一个与无连边的点需要sort
一下与相连的点,桶排太麻烦所以没必要)
另一种做法(官方题解):
考虑补图,补图里的边即大小关系未定的点对。
只需考虑度数的点,它们在补图中度数,也即至少和一个点未确定大小关系。
考虑一个最小的能调整的结构:菊花图(一个点和一个集合中所有点均有边构成的菊花,)。调整方式同上。
所以题意变成:给一个图,求一个边集使得每个连通块都是一个菊花图。
那只需对每个连通块求出任意一棵生成树,DFS就可以且一定可以拆出若干菊花图。然后在每个菊花上调整大小关系即可。
DFS是的。但第一种写法好强啊/kel。
平面上有n条直线,将平面划分成若干个区域。对这些区域黑白染色,使得相邻区域颜色都是不同的。
增量构造。每次加一条直线,将直线一边的取反即可。
确定一个右下角的点,每次将一行/一列的点依次弄过去(八数码)。
保持,so尽量保持一个方形。的情况特判。
左转右转并绕回去
90 270 90、90 270 270:一个矩形的一角,凹下/凸出一块
90 270 可以删掉,之后再做调整
调整成整数坐标:每次乘加然后凸/凹,最后还要离散化一次。
https://ac.nowcoder.com/acm/contest/10662
思路:从变成一个比较好的中间状态,再变到。若操作可逆,则可判断是否有、。
但不可逆。so找一个中间状态:一条链。
直径的树每次都可选直径和一个点次内使直径+1。
找中间状态:全朝一个点连边的状态。
。而树是一个二分图。
弄出二分图左边,右边对应点。然后避免左边、右边内部相连,左边数前加个,右边数前价格。
给定。构造一个字符集大小没有限制、长度不超过的字符串,使得不同的子串个数恰好为。
。
做法1:
考虑简单的,,则不同子串数为:。
不妨先求出最小的使得。令,有一个结论是“任何一个数可由最多三个三角数构成”,所以从大到小找出构成的即可。剩下的数直接补。
网上有个题解是从小到大找,似乎是会超过三个的(不满足结论)。
细节:较小如时(实测只有或),会大于(因为增长不够快还是?)。所以较小时需特判,直接输出个就ok。
做法2:
直接考虑构造,令,则子串数为。
条件为即,枚举和,保证且即可找到解。
较大的时候,这个枚举效率似乎就不如做法1了。
网上这题题解都是远古时代的了... 不过dls这课件也是远古-的了(但还加新题好良心)
,设有组,只需保证,总数。
调整:变成。
在一个的网格上,构造一棵树(边是四连通),满足:树上每个点上有一个人,每次随机上下左右走一格(走到树外则原地不动消耗一次),有超过的概率步后所有人不会走到同一个点。
只需尽可能让路径长(是吧?)。
也就是要让空间利用率尽可能高。蛇形路径空间利用率低(约)(可以随机一百次求一下概率),阶梯型路径利用率高就可以过了(约)。
阶梯型拿excel随便搞搞就弄出来了:
主要是注意可以弄这个结构:
然后能额外扩展的部分就多扩展一下,尽可能覆盖多的格子。
区间等比数列:
fibonacci:用通项表示:,维护区间等比数列;矩阵
询问区间本质不同子序列个数:
矩阵,表示有多少串以开头以结尾,且不是的子序列但去掉最后一个字符后是的子序列。
区间合并:,即。
串:加一个不出现的字符,则即所有以开头的子序列数。
反转:,,转置
标记:,修改:。
历史最值:(因为形式为水平线+一条直线,称作上折线),表示值为。
历史最值与当前最值合并:两条上折线合并仍是一条上折线,所以可以用表示。
:乘一个模会合并某几种数。对给定情况,有约数个数种合并情况。维护约数个数个序列信息,可以发现乘某个数时这些序列可方便更新或由其它序列更新。
区间加减、开根:
先考虑修改区间是,数据随机。
区间加减复杂度考虑相邻两项差的绝对值的变化(可以差分然后只影响个点)。,即差在开根号,所以需次变为()。
而和最多差。
给定长为数列,需支持区间、、求区间最大值。
。
考虑更简单的情况:所有操作区间为。
如果的值随机,那么几次之后所有数就全相同了。
如果不随机,至少在中为、中为的这些位都全相同了。
对于不同的二进制位直接对所有数求最大值。
若区间不为,维护一个表示某区间所有数都相同的那些位,以及区间最大值。
若当前修改 中为的位 或 中为的位 是当前节点的的子集,就可以直接整体修改,而且就是对该区间所有加上 。直接打区间加减的修改即可。
所以,直接用吉司机线段树的写法,记中为的位 或 中为的位集为,若当前区间是修改区间的子区间 且 s&same[x]=s
,则进行区间加/减;否则递归子区间。
查询时可以直接查区间。
复杂度(🌿没好好听jls讲),应该也是常表现为的?
代码可以看这儿。
PS:关于暴力写法,涉及到两种,需要先定义标记的优先级(先下放哪个)。优先级低的标记修改直接改,优先级高的标记修改时,需要用优先级高(先下放)的修改一下优先级低的(后下放)的。
如区间加、乘,若先下放乘再加,则加操作时直接加,乘操作时加标记需要乘一下。
http://acm.hdu.edu.cn/showproblem.php?pid=6089
最小乘积生成树: BZOJ2395
1.
平面上随机个点,凸包上的点期望个数为。
最小的点和最小的点一定在下凸包上,且离凸包上两点形成线段最远的点一定也在凸包上。
所以需要求离最远的点。化简距离公式,可以转成新图上的最小生成树。
然后再对、做同样算法(新图上生成树找到最远点即凸包上的点),
2.
某个线性加权下的最小生成树。
naive:将边权设为,只需考虑(除以)。
相对关系
变化时假设变为。若均在树上,则MST不变;若不在树上,则直接换掉。
2求出的每个生成树一定是凸包上的生成树,即1是2的子集;1也是求一条过某点切线和其上面的部分点,2是枚举所有方向的切线和其上面的点,所有2是1的超集。所有1的复杂度一定小于2。
ps:需满足,否则是NPC的。(so最大乘积生成树没法做,不能取反边权)
线性无关集合 价值最大:BZOJ 2460
所有满足条件的集合可以构成个数上的拟阵(可证三个条件均满足)。
CC Oct
假设答案已知,则在以为焦点的椭圆上(落在什么区域),椭圆是凸的-> 存在一条过最优点的切线,其它点都在其一侧-> 最小乘积问题
所以最小化,是任意实数,取最小的。
假设固定,则可以证明能简单贪心从小到大取小于等于个最小的,所以也只需要考虑相对关系,也能找到若干分界点,然后考虑分界点做。
杜爷题
加过的边有可能再加(不影响但会加)
表示加条边后集合仍不连通的概率。