[关闭]
@SovietPower 2021-09-14T13:03:01.000000Z 字数 7812 阅读 1032

1.25 Namomo Camp

ACM



Day1 DP

Todo

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

Good Bye 2017 G. New Year and Original Order(数位DP)

一个简单的做法是枚举每个数,DP时维护的数位各有多少个。复杂度是
观察一下的形式,比如:,可以发现数位的贡献是,数位的贡献是...也就是的贡献是,其中的数位个数。
所以DP时只需要维护的数位有多少个,求出方案数后乘就是贡献。
这样复杂度

Fountains

https://www.cnblogs.com/reverymoon/p/14153891.html

Sum

Lucky Numbers


的价值定义为:十进制表示中第位为则该位价值为,该位为价值为,为价值为,否则为,然后所有位上价值相加。
给定次询问,每次询问给定,求满足个数的和为情况下,这个数的最大价值和。


假如个数的所有位上只有,那么每一位都可以看作 总数为、体积为、价值为的物品,就是个物品、容量为的多重背包。
那么考虑怎么让尽可能多的数位上是
求和时每位是独立的,对于某一位,如果有两个数该位分别是而不是,则若,那么可以将换成;否则则可以将换成
所以对于每一位,可以满足最优情况下只有一个数该位不为。将这些不为的位放到一个数上,就满足个数的所有位上为,剩下一个数任意。
像最上面一样,对每位个物品做二进制优化多重背包,然后加上剩下的一个数就ok。
复杂度
细节:预处理一下,先把单独的那个数价值求出来,再做背包。

HDU. 6566. The Hanged Man(树形背包DP DFS序 重链剖分)


给一棵个点的树,每个点有体积和价值,求总容量分别为时选出一个最大价值独立集(相邻节点不能同时选)的方案数。


还是先考虑最简单的,表示当前为点,已选体积,选/不选的方案数。树上背包复杂度
考虑用DFS序优化树形背包。问题在于 DFS序从时,这个点可能先向上走很多步到,然后再向下到,所以需要记录的状态才能知道选没选。同理,DP时要记一个点到根节点路径上所有点的状态,状态数就成了
优化是,用重链剖分来求DFS序,先DFS轻儿子再走重儿子。这样需要向上跳时,会跳过所在的一整条重链(走一条轻边所在重链),对我们只需记的状态。
同理,只需对每一条轻边记点的状态,一共要记当前点到根节点路径上个点的状态,状态数为
复杂度
细节:先把所有点要记的所有求出来(记为)。转移时,先枚举求出的状态,然后再枚举选不选更新即可。

Day3 数论

Day4 构造

CF. 1477C. Nezzar and Nice Beatmap(构造)


给定平面上个不同的点,求一个排列,使得依次相连构成的角为锐角。无解输出-1。


连边和判断锐角,考虑大角对大边,只需要让不是最长边即可。所以直接令,即每次向最远的点连边,一定可以满足不是最长边,这样一定有解。

CF. 1477D. Nezzar and Hidden Permutations(构造)


给定个二元组,求两个排列,使得并最大化


把限制看成边。题意可以化为:给一个无向图,给边定向,使存在两个拓扑序且的点尽量少。(感觉也很抽象,对我没什么用)
考虑什么时候点一定有:和其它所有点相连的点肯定是。所以先将度数为的点删掉。
然后每个点至少和一个点没有连边。考虑一个点和一个点集),满足中所有点无连边(即大小关系任意),那么取显然可以使合法。
那如果能将图划分成若干个的结构,因为每个内部编号连续,之间的大小关系就不会改变,那么就找到解了。

那我们就模拟这个过程。称上面的与无连边的为关键点。
对于一个尚未考虑的,任取与无连边的点记为

可以发现这个构造只需满足“对任意点存在一个和它没有连边的点”,且最终每个点都属于一个结构且每个结构有一个关键点和。所以一定有解使所有满足
set维护,复杂度。或者unordered_map可以。(不过找一个与无连边的点需要sort一下与相连的点,桶排太麻烦所以没必要

另一种做法(官方题解):
考虑补图,补图里的边即大小关系未定的点对。
只需考虑度数的点,它们在补图中度数,也即至少和一个点未确定大小关系。
考虑一个最小的能调整的结构:菊花图(一个点和一个集合中所有点均有边构成的菊花,)。调整方式同上。
所以题意变成:给一个图,求一个边集使得每个连通块都是一个菊花图。
那只需对每个连通块求出任意一棵生成树,DFS就可以且一定可以拆出若干菊花图。然后在每个菊花上调整大小关系即可。
DFS是的。但第一种写法好强啊/kel。

区域划分

平面上有n条直线,将平面划分成若干个区域。对这些区域黑白染色,使得相邻区域颜色都是不同的。
增量构造。每次加一条直线,将直线一边的取反即可。

LEARN FROM A GAME

确定一个右下角的点,每次将一行/一列的点依次弄过去(八数码)。
保持,so尽量保持一个方形的情况特判。

90 AND 270

左转右转并绕回去
90 270 90、90 270 270:一个矩形的一角,凹下/凸出一块
90 270 可以删掉,之后再做调整
调整成整数坐标:每次乘然后凸/凹,最后还要离散化一次。

Jinan E

https://ac.nowcoder.com/acm/contest/10662
思路:从变成一个比较好的中间状态,再变到。若操作可逆,则可判断是否有
但不可逆。so找一个中间状态:一条链。
直径的树每次都可选直径和一个点次内使直径+1。

已经不知道哪个题..

找中间状态:全朝一个点连边的状态。

Jinan J

。而树是一个二分图。
弄出二分图左边,右边对应点。然后避免左边、右边内部相连,左边数前加个,右边数前价格

HDU. 5334. Virtual Participation(构造)


给定。构造一个字符集大小没有限制、长度不超过的字符串,使得不同的子串个数恰好为


做法1:
考虑简单的,则不同子串数为:
不妨先求出最小的使得。令,有一个结论是“任何一个数可由最多三个三角数构成”,所以从大到小找出构成即可。剩下的数直接补
网上有个题解是从小到大找,似乎是会超过三个的(不满足结论)。

细节:较小如时(实测只有),会大于(因为增长不够快还是?)。所以较小时需特判,直接输出就ok。

做法2
直接考虑构造,令,则子串数为
条件为,枚举,保证即可找到解。
较大的时候,这个枚举效率似乎就不如做法1了。

网上这题题解都是远古时代的了... 不过dls这课件也是远古-的了(但还加新题好良心)

Festival

,设有组,只需保证,总数
调整:变成

ICPC2020 南京. A. Ah, It's Yesterday Once More(构造)


在一个的网格上,构造一棵树(边是四连通),满足:树上每个点上有一个人,每次随机上下左右走一格(走到树外则原地不动消耗一次),有超过的概率步后所有人不会走到同一个点。

只需尽可能让路径长(是吧?)。
也就是要让空间利用率尽可能高。蛇形路径空间利用率低(约)(可以随机一百次求一下概率),阶梯型路径利用率高就可以过了(约)。

阶梯型拿excel随便搞搞就弄出来了:

主要是注意可以弄这个结构:
然后能额外扩展的部分就多扩展一下,尽可能覆盖多的格子。

Day5 线段树

区间等比数列:
fibonacci:用通项表示:,维护区间等比数列;矩阵

询问区间本质不同子序列个数:
矩阵,表示有多少串以开头以结尾,且不是的子序列但去掉最后一个字符后是的子序列。
区间合并:,即
串:加一个不出现的字符,则即所有以开头的子序列数。
反转:,转置

标记:,修改:
历史最值:(因为形式为水平线+一条直线,称作上折线),表示值为
历史最值与当前最值合并:两条上折线合并仍是一条上折线,所以可以用表示。

:乘一个会合并某几种数。对给定情况,有约数个数种合并情况。维护约数个数个序列信息,可以发现乘某个数时这些序列可方便更新或由其它序列更新。

区间加减、开根:
先考虑修改区间是,数据随机。
区间加减复杂度考虑相邻两项差的绝对值的变化(可以差分然后只影响个点)。,即差在开根号,所以需次变为)。
最多差

COGS. 2638. 数列操作(吉司机线段树)


给定长为数列,需支持区间、求区间最大值。


考虑更简单的情况:所有操作区间为
如果的值随机,那么几次之后所有数就全相同了。
如果不随机,至少在中为中为的这些位都全相同了。
对于不同的二进制位直接对所有数求最大值。

若区间不为,维护一个表示某区间所有数都相同的那些位,以及区间最大值
若当前修改 中为的位 或 中为的位 是当前节点的子集,就可以直接整体修改,而且就是对该区间所有加上 。直接打区间加减的修改即可。
所以,直接用吉司机线段树的写法,记中为的位 或 中为的位集为,若当前区间是修改区间的子区间 且 s&same[x]=s,则进行区间加/减;否则递归子区间。
查询时可以直接查区间

复杂度(🌿没好好听jls讲),应该也是常表现为的?
代码可以看这儿

PS:关于暴力写法,涉及到两种,需要先定义标记的优先级(先下放哪个)。优先级低的标记修改直接改,优先级高的标记修改时,需要用优先级高(先下放)的修改一下优先级低的(后下放)的。
如区间加、乘,若先下放乘再加,则加操作时直接加,乘操作时加标记需要乘一下。

HDU.

http://acm.hdu.edu.cn/showproblem.php?pid=6089

Day6 最小乘积问题 斯特林数

最小乘积生成树: BZOJ2395
1.
平面上随机个点,凸包上的点期望个数为
最小的点最小的点一定在下凸包上,且离凸包上两点形成线段最远的点一定也在凸包上。
所以需要求离最远的点。化简距离公式,可以转成新图上的最小生成树。
然后再对做同样算法(新图上生成树找到最远点即凸包上的点),
2.
某个线性加权下的最小生成树。
naive:将边权设为,只需考虑(除以)。
相对关系
变化时假设变为。若均在树上,则MST不变;若不在树上,则直接换掉

2求出的每个生成树一定是凸包上的生成树,即1是2的子集;1也是求一条过某点切线和其上面的部分点,2是枚举所有方向的切线和其上面的点,所有2是1的超集。所有1的复杂度一定小于2。

ps:需满足,否则是NPC的。(so最大乘积生成树没法做,不能取反边权)

线性无关集合 价值最大:BZOJ 2460
所有满足条件的集合可以构成个数上的拟阵(可证三个条件均满足)。

CC Oct
假设答案已知,则在以为焦点的椭圆上(落在什么区域),椭圆是凸的-> 存在一条过最优点的切线,其它点都在其一侧-> 最小乘积问题
所以最小化是任意实数,取最小的。
假设固定,则可以证明能简单贪心从小到大取小于等于个最小的,所以也只需要考虑相对关系,也能找到若干分界点,然后考虑分界点做。

杜爷题
加过的边有可能再加(不影响但会加)
表示加条边后集合仍不连通的概率。

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