题解
T1 小K与集合
贪心
先考虑最简单的情况:如果有k个1,把它们分到k个集合里,那么无论如何
少一个1可以用k个2来补,少一个2用k个3来补(类似于k进制下的进位思想。)
因此:k个i+1等同于 1个i的贡献
对于给定的序列 变成长度k个部分,每个里面至少含有1个1(或者与1等价的k个2或,k*k个3…以此类推)
每个部分都是 1 k 的 贡 献 \frac{1}{k}的贡献 k1的贡献
直接从后往前扫一遍,若当前数的数量为n,就向前进n/k位。
T2 小K与数据
42pts:
暴力并查集:
得到一个树形结构,维护相等关系
从右往左跳,最多跳 m 2 m^2 m2次
每个并查集里看是否有任何点被赋了字符
100pts
和并查集一样的思想,但不需要建立并查集,因为题目已经给出了父子关系。
题目给出了m2对关系 不妨叫左边区间 [ l 1 , l 2 ] [l1,l2] [l1,l2]和右边区间 [ l 2 , r 2 ] ; [l2,r2]; [l2,r2];
对于给出的已知的字符的位置x:
-
找出它所在的右边区间 [ l 2 , r 2 ] [l2,r2] [l2,r2],由于右边区间互不相交,所以包含x的区间有且只有一个(这也符合并查集的性质)。
-
然后跳向左边区间对应的位置,更新x,直到调到最左边(即找不到一个右边区间包含它)为止。
这一步相当于并查集调到根节点。
-
并将这个已知的字符赋给最左边这个位置。
对于每一个询问:
也和上面一样向左跳,找到对应的位置,若这个位置已经被赋值,则成功找到,否则没有。
小补充:具体怎么跳呢,为了效率,本来从1到2再到3,可以直接从1到3,有点像并查集的压缩路径(详细见代码),看下面这个图就可以了呀√
T3 小K与奇数
缩点+欧拉回路
题意:
选n/2条链,n个端点覆盖所有点,n条链没有边相.交,覆盖了所有边。每条边的长度必须是偶数。
注意:这道题的图都是连通图
如何求解?
有解满足:每个点的度数是奇数,总边数是偶数
对于一张图,k个奇点,把每个链拆开(每个点的度数不变),原图变为新图,在新图跑一遍欧拉回路
至于大佬还提到了 带花树?~~(蒟蒻不知道也不敢问)~~之后学一波
分析
我们要找出长度为偶数的赛道,可以用长度为2的赛道来构造更长的,所以就考虑找出图中长为2的链覆盖
把一条长度为2的两条边缩成一条边(就是忽略中转点),使这条边不带偶数限制
例如: 边u到v 和边v 到w 缩成 边u到w
然后我们考虑短链并成长链的情况,缩完之后的树边就可以两两组合形成更长的链 ,也就是建出的树的节点上的树边两两组合之后正好将原长度为2的链新接了一个长度为1的赛道上去 ,因此向上递归的过程中链长是不断更新的 。
也就是说已经建出的树上连接出的任意一条其他的边都是非树边,所以对一个节点来说非树边只向自己的祖先连,然后每条连接自己祖先的非树边都可以让链长加1 ,可能加着加着就加成奇数了,如果是奇数就借用一下自己父亲和自己爷爷连的边。
再把缩后的边展开成原图的形状,每条边都变成两条边(带偶数限制)
具体做法:
自下向上dfs,假设子树中的树边已经全部被匹配过,那么只考虑底下连接当前节点的非树边,以及当前节点连接父亲的边
多出来的边(非树边)和父亲匹配,否则父亲和上面的其他边匹配。(上面的分析已经很清楚了orz)
求出链覆盖后,跑欧拉回路就好啦
今日份总结
写这篇题解的时候快到十一点半啦,这个题解也是对得起自己的良心啦(写了好久emmm)。
虽然考得不怎么样,但至少一二题都拿了暴力分~~(虽然是暴力中的暴力orz)~~。
感觉考试还是很有收获的,至少在改题的时候可以知道更多的算法,收获解题技巧和思路QWQ