杭电牛客多校训练记录
PS:
每场会对我认为有价值的题目进行补题,补了的会有\(\checkmark\),不补的题会在比赛号的超链接中注明不补的原因,标\(\checkmark\)但是没有超链接跳转到对应题解的一般是题目个人认为比较怪补题价值不大或者是签到,标\(qaq\)的一般是超出能力范围的论文题/绝世好题,标!的是题目有补的意义但是对应前置知识对本人而言太难学(比如tarjan相关),暂时留坑,以后有机会会补。算法的坑会单独列一个表格。
杭电多校
\(比赛\) | \(01\) | \(02\) | \(03\) | \(04\) | \(05\) | \(06\) | \(07\) | \(08\) | \(09\) | \(10\) | \(11\) | \(12\) | \(13\) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
\(2022-1\) | |||||||||||||
\(2022-2\) | |||||||||||||
\(2022-3\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | ||||||||||
\(2022-4\) | |||||||||||||
\(2022-5\) | |||||||||||||
\(2022-6\) | \(\checkmark\) | ||||||||||||
\(2022-7\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | 无 | 无 | |
\(2022-8\) | \(\checkmark\) | ||||||||||||
\(2023-1\) | |||||||||||||
\(2022-2\) | |||||||||||||
\(2022-3\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | ||||||||||
\(2023-9\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | |||||||
\(2023-8\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | |||||||
\(2023-9\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | |||||||
\(2023-10\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) |
牛客多校
\(比赛\) | \(A\) | \(B\) | \(C\) | \(D\) | \(E\) | \(F\) | \(G\) | \(H\) | \(I\) | \(J\) | \(K\) | \(L\) | \(M\) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
\(2022-1\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | ||||||||
\(2022-2\) | |||||||||||||
\(2022-3\) | \(\checkmark\) | ||||||||||||
\(2022-4\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) |
\(2023-7\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | \(\checkmark\) | ||||||
\(2023-9\) | |||||||||||||
\(2023-10\) | \(\checkmark\) |
其他区域赛套题
\(比赛\) | \(A\) | \(B\) | \(C\) | \(D\) | \(E\) | \(F\) | \(G\) | \(H\) | \(I\) | \(J\) | \(K\) | \(L\) | \(M\) |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
\(NWERC2023-2024\) |
2022杭电3
D
考虑暴力dp,\(f_{i,S}\) 表示S集合的糖果分给i个小孩子的最小不悦值,转移显然,复杂度 \(O(m3^{n})\),无法通过。
单看dp的第一维,按照i分层的话只会在相邻层转移,考察相邻层的转移,发现是一个子集上的斜率优化。直接维护每个子集的凸包仍然是 \(O(m3^{n})\) 的,考虑一种我个人感觉比较神奇的做法:
设当前求解 \(f_{i,S}\),那么先枚举想要转移的T的前n/2位,再枚举对应的S的前n/2位,复杂度是等价于子集的子集 \(O(3^{\frac{n}{2}})\),再枚举S的后n/2位,这时需要做的就是求在T的后n/2位任意的情况下的最小值。
对S的后n/2位的子集维护凸包,暴力二路归并的复杂度是对的(这块我先再想想,还没弄清楚)
复杂度 \(O(m6^{\frac{n}{2}})\)。
2022杭电7
B,C:场上口胡出来了D:签到
F:比较熟悉的数位dp
A
每个点能通过凸包当且仅当方向向量在两条切线之间,转化为给定一个点,询问有多少区间包含它,差分前缀和之后直接回答即可。
E
求期望等于记总数。枚举边长( \(O(\sqrt{nm})\) )和四个角的种类(256种),剩下就只需要完成边上的填充,这是所有的块可以分成三类:能填横边的,能填竖边的,都可以的。枚举多少个能填竖边的(这块的复杂度也是边长级别的),剩下的就是简单的预处理组合数。复杂度 \(O(256nm)\)。
G
先考虑暴力dp,f(i,j)表示i节点子树,i的权值为j的最小代价,暴力转移复杂度不够优秀。观察转移方程,发现除开当前点代价之外,dp值不超过 \(O(儿子个数)\),因为在转移时并不关心j的具体值,而是只关心j和边权的大小关系,小于则转移一个前缀min,反之则是后缀min。把这些值以及对应的区间用set维护起来,最后的结果就是若干个值相同的区间,整体再加上两个等差数列,可以很方便的维护前缀min和后缀min。转移时先对边权从小到大排序,再从小到大枚举边,每次枚举都会导致一个点的转移从后缀min变成前缀min,在set上查询后暴力修改即可。
H
结论:当且仅当\((a-1)\oplus (b-1)\oplus (c-1)=0\)时先手必败。
证明和nim类似,设\((a-1)c (b-1)\oplus (c-1)=0\)为必败态,否则为必胜态,证明必败态必然转移向必胜态,必胜态存在一种方案转移向必败态。
J
和 这道题 类似。只是这次对于每条边加权p,不存在的边加权(1-p)。由于加权,如果直接设EGF的话会发现卷积无意义,但是给每张点数为n的图再加权 \((1-p)^{\frac{n(n-1)}{2}}\) 卷积的结果就有意义且刚好满足我们的需求。设G(x)是n个点的图的权值和除以 \((1-p)^{\frac{n(n-1)}{2}}\) 的生成函数,F(x)是n个点的连通图的权值和 \((1-p)^{\frac{n(n-1)}{2}}\) 的生成函数,由exp的组合意义,G=exp(F)。
至于为什么想到要把n个点的图的权值和除以 \((1-p)^{\frac{n(n-1)}{2}}\),考虑卷积的时候多了一团我们不想要的 $(1-p)^{(n-k)k} $,把k和n-k看成a和b,那么我们最后就是要让 \(a_n\) 带上一个权值使得满足 \(f_{n}a_{n}=\Sigma C(n,k)f_{k}a_{k}f_{n-k}a_{n-k}(1-p)^{(n-k)k}\)。同时\(f_{n}=f_{k}f_{n-k}(1-p)^{(n-k)k}\)。可以联想到一个式子 \(\frac{(a+b)^2}{2}=\frac{a^2}{2}+\frac{b^2}{2}+ab\)。
2023杭电3
1005和1011场切了。
1012
可以发现这个操作很像辗转相减,推一推可以知道每个点只有一个前驱,那么所有点和前驱-后继关系形成一个trie树结构,其中每个节点都是一个字符串,要求的是给定询问串子树内的串个数。由辗转相除法,如果把相同的字符压缩,长度是不超过log的,那么把初始串和询问串放一起排序即可。
代码学习笔记
2023杭电7
A
对每个连通块用可持久化值域线段树维护颜色的情况,再用一个并查集记录每个点是哪种颜色。操作1直接启发式分裂,操作2直接暴力找出颜色区间的所有颜色,用并查集新建一个结点表示这些颜色都会变成这个集合的颜色,把颜色叶子结点的fa全部连向新建的结点。操作3就是在对应版本的线段树上询问区间和。
代码学习记录
D
构造是13131313....2213131313...
这个构造的直观想法是尽量让2当中位数,因为1和3当中位数时中位数个数一定过半,那么如果要让2当中位数,就要让1和3尽量接近,就有了这样的构造。
E
在SAM和序列自动机上分别维护某节点之后的子串/子序列个数之后同时贪心即可。
2023杭电8
01
取自然对数之后发现指数上是个卷积,直接卷即可。注意使用任意模数NTT。
02
要求的是一个向量是否能够缩短使得在一个凸包内(这个凸包就是 \(B\) 和 \(-A\) 的闵可夫斯基和)。可行域是由 \(O(n)\) 条直线包络而成,暴力枚举每个边界上的最小值即可。
03
crt合并即可。
注意是必要条件,最后要代回判充分。
08
令 \(dp_{i,j}\) 为 \(i\) 个向量,基的大小为 \(j\) 的方案数。由于大小为j的基在题目给定的空间里张成的空间大小是 \(p^{j}\),所以枚举当前新加入的向量是不是基即可。
2023杭电9
01
先对树树剖并重标号。用可持久化线段树维护权值 \(\geq x\)的所有点分布情况(具体实现按照从大到小插入即可),具体地说,维护当前点在当前版本是否存在,以及区间和前后缀的最长1段。几种修改类似,只介绍一种:\(x \rightarrow x+1\), 就是 \(x+1\) 对应的版本变成了原本 \(x\) 对应的版本,把线段树的指针重新拨向正确的节点即可。查询就是从起点跳重链,在对应区间上查询区间和前后缀的最长1段的长度,据此信息已可以维护出答案。
02
在暴力的基础上加个记忆化即可,因为在整除分块/杜教筛的学习中我们已经知道:
于是记忆化的个数只有 \(\log ^{2}\) 的级别。
04
一个不难的发现是如果钦点一棵树出现,那么就要求一些边不能出现(这些边就是对于每条被钦定的边,权值比他小而且连接了由他连接的两个集合的边),而且对于任意两条边,他们对应的这个集合是不交的。所以
只要知道连接的是哪两个集合,那么矛盾的边集就是确定的。所以设 \(f_{i,S}\) 表示前i条边,联通了S集合的概率,\(g_{i,S}\) 表示前i条边,联通了S集合的所有方案的边权和。拆一下贡献,这等价于对每条边求出存在于MST的概率乘自身的权值,转移:
考虑P是什么,是所有与 \(i\) 成环的边的 \((1-p_{i})\) 之积,设 \(sum_{S}\) 表示前i条边中,S的导出子图的所有边的 \((1-p_{i})\) 之积。那么 \(P=\frac{sum_{S}}{sum_{L}\times sum_{S/L}}\),边dp边维护即可。
07
考虑到一定存在答案的长度一定在 \([K,2K-1]\) 之间,否则可以拆成两个 \(\geq K\) 的链并选择较大的。\(f_{i,j}\) 表示i子树中深度为j的链最大,次大权值和,在树上dfs的同时维护 \(f\) 和答案,这部分是 \(O(nK^{2})\) 的。再来看修改,改变某一个点的所有dp值并对K级祖先以内重新维护 \(f\) 和答案,重要的条件是权值只会增加,那么对于一个点,某个儿子改变时,只需要check新的值是否比当前的最大和次大大即可。初始化 \(O(nK^{2})\),单次修改要先对每个点重新更新f \((O(K))\),然后重新暴力卷出答案\((O(K^{2}))\),总复杂度 \(O(nK^{2}+qK^{3})\)。
08
鞅理论相关,博客链接。
10
二分答案,转换一下题意,相当于限制每种边不能删去超过(这种边的总数量-这种边的最多保留数)条,请问能否删去(边数-所有边的最多保留数之和)条边。删边后联通是图拟阵的对偶拟阵,每种边不能删去超过给定值条是一个划分拟阵。用拟阵交判定即可。直接做是 \(O(r^{2}n)\) 次独立性谕示 \(=O(n^{4}\log W)\) 的。因为图拟阵比较特殊,在只加一条边的情况下可以 \(O(1)\) 判联通(即独立性谕示),先预处理所有的 \(I+\{x\}\) 对应的并查集,\(I+\{x\}-\{y\}\)就是在原基础上加一条边,并查集 \(O(1)\) 判联通。这样复杂度是 \(O(\log W \times n(n^{2}+n^{2}+n))=O(\log W \times n^{3})\) 的。
2023杭电10
02
要发现三个性质,场上只发现了前两个:
1.操作区间不会相交,否则可以调整,把较早操作的那个在交集的部分去掉,代价不增。
2.对于包含关系的两个区间,一定是大的先进行,否则可以去掉小的,代价减少。
3.也不存在两个操作区间共左/右端点的情况,否则可以把较大的区间的交集部分去掉,代价不增而且不会新增分界点。
设 \(f_{l,r,k}\) 表示区间 \([l,r]\) ,错了 \(k\) 个位置的最小代价。
转移考虑这个区间是否全部刚好被一个操作区间覆盖,如果没有,那么根据性质1,可以以找到一个分界点使得两边互不影响,枚举分界点,给两边分配错误个数,这部分是 \(O(n^{3}K^{2})\) 的。
如果有,那么根据性质3,这种颜色一定是 \(b_{l}\),否则可以把 \(l\) 右移,因为这次染色不对 \(l\) 的纠正做贡献。设 \(g_{l,r,k}\) 表示 在 \([l,r]\) 上进行一次修改为 \(b_{l}\) 的操作之后,再染成和 \(b[l,r]\) 只有 \(k\) 个位置不同的最小代价。每次枚举上一个转折点 \(pos\) 和最近这一段内的错误数 \(x\) 即可,一个区间要么自己重新染色,对应转移 \(g_{l,pos-1,k-x}+f_{pos,j,x}\),要么全部染成 \(b_{l}\),对应转移 \(g_{l,pos-1,k-(b[pos,r]中颜色不为b_{l}的位置个数)}\)。这也是 \(O(n^{3}K^{2})\) 的。
最外层的dp类似,但是要把“全部染成 \(b_{l}\)”改成不操作,即a和b的对应位置匹配作为代价,为此单独写一下最外层的dp即可。
04
发现随机过程结束当且仅当(x被选中||x-1和x+1都被选中)。
只考虑x在中间的情况,有:
两边的类似。
05
首先对于固定的 \(T_{1}\) , \(T_{2}\)的边权是确定的,具体地说,是一条 \(T_{1}\) 上的路径。然后,对于任何一条 \(T_{1}\) 上的边,在两颗树上的贡献次数mod 2是相同的,那么在两颗树上的贡献次数不同当且仅当在 \(T_{2}\) 中的贡献次数 \(\geq 2\)。那么整棵树合法的条件就是对于任意两条 \(T_{2}\) 上的边,它们包含的 \(T_{1}\) 上的边集不交。树上差分树上前缀和判断即可。
09
考虑一种物品的代价是若干个凸函数,那么每两个站点之间的代价是凸函数,答案只会取在端点处,再维护二阶导和一阶导,从左往右维护答案即可。
10
一个字符串 \(s\) 合法当且仅当 \(s\) 是 \(S'\) 的子串,并且存在一个border \(l\) 满足 \(|s|+l=S\),证明见官方题解。
对每个位置维护最长的后缀满足后缀是 \(S'\) 的子串,显然这个是不降的。这个和NOI2018你的名字是挺像的。
对于每个询问,区间内可以分成 \(pos_{i}\leq l\) 和 \(pos_{i}> l\),两部分都很好算贡献,第一部分就是 \(\sum pos-kl\),第二部分就是 \(\sum (长度在[1,x]内的border个数)\)。
2022牛客1
C
Hint 1:每行只需要关心最左边的人
Hint 2:限制构成一张折线图
Hint 3:折线图中两类线的斜率分别单增单减
Hint 4:扫两遍求出对于每一行的限制取min即可
O(mq)
E
令 $f_{i,j,0/1}$表示A的i子树和B的j子树匹配,i节点一定/不一定和j匹配的答案,发现转移是二分图最大权匹配。O(n^{3})
2022牛客3
H:板子A,J:签到
2022牛客4
B:积分题,题解讲的很清楚G,J:分类讨论题
K,M:签到
L:怪题,感觉补了没啥太大用
A
微扰法板子,列出微扰前和微扰后的权值做差可得答案一定是按照每个元素的某一特征值排序后的取法,直接背包即可,注意为了方便统计贡献需要从后往前dp。
C
直接暴力列出生成函数,发现除开exp(x)外其余多项式长度之和不是很大,于是在不展开exp(x)的情况下卷积,询问时再展开即可,由于询问时相当于手动卷积,而两个被卷的式子中有一个的长度不超过c,所以复杂度正确。
D,E
先考虑二维,显然可以维护一个阶梯状折线然后二维前缀和,那么对于三维的情况,暴力枚举第三维,对另外两维套用前面的方法,发现每次是排序-打标记,排序可以直接归并,也可以用set维护插入。
F
树上回滚莫队+支持双端插入和撤回的回文自动机
树上回滚莫队是先树分块,然后块内暴力,块间莫队。考虑到这题是链上询问,甚至不需要保证块大小,只需要块直径,所以可以直接一遍dfs,当前子树内直径大于阈值就分一个块。
支持双端插入和撤回的回文自动机看17年论文就行,撤回就是维护每个前缀的最长回文后缀对应节点,暴力删点,如果一个点没有儿子了就把这个点删掉。双端插入只需要额外维护一个全串最长回文前缀,由于回文性质,fail同时也表示最长回文前缀。
为了撤回复杂度正确,需要使用不基于势能的插入,具体做法是维护一个快速跳fail的指针,指向能匹配某个字符的最长回文后缀。复杂度会多一个字符集。
I
枚举T中的每一种值,T中当前值赋1,否则为0;S中小于该值的记为1,否则为0,原题转化为对应位置点乘为0,K维FFT可以解决但复杂度不够优秀,发现可以压成1维,做法是把每一维看做一个进制,把多维坐标转换为一个整数,进而得出一维多项式,直接卷积即可。
N
稳定当且仅当所有的二进制数之间只有包含关系(只有这样一次操作之后两个数不变),从大到小排序之后一定是前面一部分为1,后面一部分为0,在碰撞过程中方差=\(E(x^2)-E^2(x)\),期望不变,操作前后两个数的差不降,故方差不降,所以稳定时同时方差也取到最大值。
2023牛客7
B
在dsu on tree的同时维护 \(a_{i}\) 表示编号为 \(i\) 的点是否在子树内。一条边在某次操作中没有被操作当且仅当操作的编号区间的所有点在子树内或者子树外。每次改变a时暴力更新答案,发现需要常数次二维数点。总复杂度 \(O(n \log^{2}n)\)。
E
考虑根号分治。按照度数 \(\geq \sqrt{n}\) 分为大点和小点。
修改时小点修改自己和邻居,大点修改自己。查询时小点查自己的邻居,大点因为小点的贡献已经加过来了,所以只需要查大点与大点之间的贡献。因为有加边,所以还要调整类型,在调整时注意重新安排信息。显然不需要写大点变小点,只需要写小点变大点。
G
按照gcd拆环。如果环是偶环,那么设任意相邻两个操作了x次,消一圈回来发现x必须是0,并且常数项也必须是0.如果是奇环那么可以解出x,再检验x是否合法,因为x可能使得中间的某些位置小于0。(虽然不是很懂为什么会有这种不合法)
H
楼房重建的套路,考虑两个区间怎么合并答案。区间内维护折线下面积,区间最大值,区间蓄水面积。对于一个区间 \(x=[l,r]\),对 \([mid,r]\) 递归询问答案。如果全局最大值小于左侧水面高度,那么答案就是一个矩形减去区间折线下面积如果左半部分的最大值已经大于左侧水面高度,那么向左儿子递归;否则左边的答案也是一个矩形减去区间折线下面积,再递归向右半部分。
I
长度小于20的暴力枚举,大于20的容斥。
J
仙人球的连通块数=点-边+环。三者的贡献拆开算,最后可以规约到在树上维护子树内一次函数和,树上差分即可。
K
典,懵哥新手题解讲得很清楚。
2023牛客9
EDI场切了。
B
发现幂塔是一个显然的解,就变成了洛谷P4319。
G
首先发现轮到一个人时,他可以采取无效操作拖时间,又因为是公平博弈,所以一个状态如果在A手里必败,在B手里也必败。所以只有三种情况:
- 先手一步取胜
- 先手第一步无论怎么走,后手都能一步取胜
- 游戏无法终止
难点在于判断第二条,发现第二条等价于:
这等价于
这意味着 \(a_{i} \oplus k\) 在异或运算下封闭,这等价于 \(n=2^{基的大小}\)。
2023牛客10
G
显然直接硬套逐字符贪心是不好贪的,因为无法轻易的判断之后再加字符有没有可能更优。但是对于固定的长度,还是显然可以贪的。check函数就是判断区间里能不能在满足必选条件的情况下选出一个回文子序列。这个dp是平方的,因为每次转移只用考虑最外面的必选点,每次匹配都是在解决必选点的问题。再还有一点是在逐字符贪心时对于同一个字符有至多4种选字符对的方法,每一种都对应一个不同的接下来的区间。没有什么特别好的方法只能暴力存起来然后一个一个判,这样至多要判 \(O(n^3)\) 个区间内是否能选出回文子序列/能选出长度为0/1的回文子序列。但是区间只有平方种,所以可以先对每个区间预处理下一个字符对应的所有后续区间。在贪心时直接 \(O(1)\) 调用即可。
NWERC2023-2024
J
需要一个关键性质:最优方向一定是某两条方向形成的直线。
证明:考虑对一个固定的访问顺序,这时相当于要最小化一个向量集在某方向和正交方向的投影的和。先考虑一个向量,发现贡献是类似于A(|sin(x)|+|cos(x)|)的东西,单独研究|sin(x)|+|cos(x)|,在[0,\(\pi\)]是上凸的。稍微感受一下可以知道,在两个向量的夹角内部,每个向量的贡献都是上凸的 ,那么和是上凸的,最小值一定取在端点而不是中间的任何一个点。
C
Be lazy!维护每个人的位置和加法,乘法标记。发现只有在gcd(n,k)>1的时候才会发生相撞事件,而一旦相撞事件发生,n至少减半,那么在不发生相撞时维护标记,发生时先把标记推平,再暴力模拟下一步。
E
令 \(y_{i}=log_{2023}log_{2023} x_{i}\),操作变成 \(y'_{i}=y_{i}+2023^{y_{j}}\)。把y看成2023进制数,用一个数组维护哪些位上有1,那么操作就是创造一个新数,它的数组是原来某个数的数组再插入元素j构成的新数组。每次产生新数的同时维护数之间的偏序关系,比较两个数就是按位比较各自数组字典序。\(O(n^{2}logn)\)
G
拉格朗日乘数法。假定在所有路径上花费的油量和是C,最小化时间,等价于:
\(\sum x_{i}=C\\ minimize\sum x_{i}+\frac{d_{i}}{x_{i}}\)。
令 \(f(x_{1},x_{2}...x_{n})=\sum x_{i}+\frac{d_{i}}{x_{i}}\),\(g(x_{1},x_{2}...x_{n})=\sum x_{i}-C\),\(F=f+\lambda g\):
\(\begin{cases}\frac{\partial F}{\partial {x_1}}=0\\\frac{\partial F}{\partial {x_2}}=0\\ \cdots \\ \frac{\partial F}{\partial {x_n}}=0 \\ g(x_1 ,x_2 ,\cdots ,x_n )=0\end{cases}\)
解得 \(x_{i}=\sqrt{d_{i}}\times \frac{C}{\sum d_{i}}\),这说明极值点一定取在所有 \(\frac{x_{i}}{\sqrt{d_{i}}}\) 都相等的地方。假设这个常数是 \(k\),那么带入可得 \(k\) 满足 \(k+\frac{1}{k}=\frac{T}{ \sqrt{\sum d_{i}}}\)。