2019暑假正睿集训8.4day1题解及总结

题解

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:

  1. 找出它所在的右边区间 [ l 2 , r 2 ] [l2,r2] [l2,r2],由于右边区间互不相交,所以包含x的区间有且只有一个(这也符合并查集的性质)。

  2. 然后跳向左边区间对应的位置,更新x,直到调到最左边(即找不到一个右边区间包含它)为止。

    这一步相当于并查集调到根节点。

  3. 并将这个已知的字符赋给最左边这个位置。

对于每一个询问:

也和上面一样向左跳,找到对应的位置,若这个位置已经被赋值,则成功找到,否则没有。

小补充:具体怎么跳呢,为了效率,本来从1到2再到3,可以直接从1到3,有点像并查集的压缩路径(详细见代码),看下面这个图就可以了呀√
T2小K与数据图解

T3 小K与奇数

缩点+欧拉回路

题意:

选n/2条链,n个端点覆盖所有点,n条链没有边相.交,覆盖了所有边。每条边的长度必须是偶数。

注意:这道题的图都是连通图

如何求解?

有解满足:每个点的度数是奇数,总边数是偶数

对于一张图,k个奇点,把每个链拆开(每个点的度数不变),原图变为新图,在新图跑一遍欧拉回路

至于大佬还提到了 带花树?~~(蒟蒻不知道也不敢问)~~之后学一波

分析

我们要找出长度为偶数的赛道,可以用长度为2的赛道来构造更长的,所以就考虑找出图中长为2的链覆盖

把一条长度为2的两条边缩成一条边(就是忽略中转点),使这条边不带偶数限制

例如: 边u到v 和边v 到w 缩成 边u到w

然后我们考虑短链并成长链的情况,缩完之后的树边就可以两两组合形成更长的链 ,也就是建出的树的节点上的树边两两组合之后正好将原长度为2的链新接了一个长度为1的赛道上去 ,因此向上递归的过程中链长是不断更新的 。

也就是说已经建出的树上连接出的任意一条其他的边都是非树边,所以对一个节点来说非树边只向自己的祖先连,然后每条连接自己祖先的非树边都可以让链长加1 ,可能加着加着就加成奇数了,如果是奇数就借用一下自己父亲和自己爷爷连的边。

再把缩后的边展开成原图的形状,每条边都变成两条边(带偶数限制)

具体做法:

自下向上dfs,假设子树中的树边已经全部被匹配过,那么只考虑底下连接当前节点的非树边,以及当前节点连接父亲的边

多出来的边(非树边)和父亲匹配,否则父亲和上面的其他边匹配。(上面的分析已经很清楚了orz)

求出链覆盖后,跑欧拉回路就好啦

今日份总结

写这篇题解的时候快到十一点半啦,这个题解也是对得起自己的良心啦(写了好久emmm)。

虽然考得不怎么样,但至少一二题都拿了暴力分~~(虽然是暴力中的暴力orz)~~。

感觉考试还是很有收获的,至少在改题的时候可以知道更多的算法,收获解题技巧和思路QWQ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值