思路讲解
【线性基【力扣周赛 460】】 https://www.bilibili.com/video/BV1pm8vzAEXx/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37
视频,我只推荐灵茶山艾府。
AC代码
https://www.luogu.com.cn/record/228289095
1 | // by Gospel_rock |
【线性基【力扣周赛 460】】 https://www.bilibili.com/video/BV1pm8vzAEXx/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37
视频,我只推荐灵茶山艾府。
https://www.luogu.com.cn/record/228289095
1 | // by Gospel_rock |
下面把**“任意两点 u → v 经过哪些关键边”在 O(log n) 时间求出的方法补充得更细一些。**
给出两种写法:
思路:
从根结点 root 出发 DFS,一路累积“根 → 当前结点”这条链上出现的关键边集合,记到数组 upMask[] 里。
1 | upMask[child] = upMask[parent] | (当前这条边是关键边 ? (1<<bit) : 0); |
因为一条树上路径 (u,v) 可以分解成
root → u 和 root → v 两条链,而它们公共的部分(root → lca)在两条链里都会出现一次,
用异或就能把它抵消掉,所以
1 | pathMask(u,v) = upMask[u] ^ upMask[v]; // O(1) |
整条路径上恰好出现一次的边,正好就是 u-v 之间的那条简单路径。
预处理:一次 DFS,O(n)。
查询:连 LCA 都不用求,完全 O(1)。
1 |
这个子集确实还可以,不是很难,就是卡一下这个折半搜索01树。
你用线性基做基本不会被卡。
1 | // by Gospel_rock |
【线性基【力扣周赛 460】】 https://www.bilibili.com/video/BV1pm8vzAEXx/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37
https://leetcode.cn/problems/partition-array-for-maximum-xor-and-and/submissions/649067731/
1 | class Solution { |
核心就是知道可以发多少个月,就可以知道总共可以发多少个人次,一个人最多可以发多少钱。
1 | auto check=[&](ll mid){ |
https://acm.hdu.edu.cn/contest/view-code?cid=1176&rid=8395
1 | // by Gospel_rock |