0%

思路讲解

P2880 [USACO07JAN] Balanced Lineup G

用树状数组RMQ。

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1177&rid=12260

心路历程(WA,TLE,MLE……)

1和n的超距作用。

https://acm.hdu.edu.cn/contest/view-code?cid=1177&rid=12203

1
2
3
4
5
6
7
8
9
10
FOR(i,1,N){
ll val=A[i-1];
vis[val]=true;
ll res=tr.query(1, val-1);
if(res==-INF) res=0;
ll lans=tr.origin[val-1]+vis[val-1]+(val==1 || val==N);
// 第一次WA是WA在这里
lans=max(lans,res+(val==1 || val==N));
tr.upd(val, lans);
}

思路讲解

【莫队算法【力扣双周赛 162】】 https://www.bilibili.com/video/BV1p3h3zYEbc/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37

看视频吧,以我的理解

AC代码

https://leetcode.cn/problems/threshold-majority-queries/submissions/649553401/

心路历程(WA,TLE,MLE……)

思路讲解

【线性基【力扣周赛 460】】 https://www.bilibili.com/video/BV1pm8vzAEXx/?share_source=copy_web&vd_source=6ca0bc05e7d6f39b07c1afd464edae37

视频,我只推荐灵茶山艾府

AC代码

https://www.luogu.com.cn/record/228289095

心路历程(WA,TLE,MLE……)

思路讲解

下面把**“任意两点 u → v 经过哪些关键边”在 O(log n) 时间求出的方法补充得更细一些。**

给出两种写法:


A) 更快也更简单的一行式(查询 O(1))

思路:

从根结点 root 出发 DFS,一路累积“根 → 当前结点”这条链上出现的关键边集合,记到数组 upMask[] 里。

1
2
upMask[child] = upMask[parent] | (当前这条边是关键边 ? (1<<bit) : 0);

因为一条树上路径 (u,v) 可以分解成

root → u 和 root → v 两条链,而它们公共的部分(root → lca)在两条链里都会出现一次,

用异或就能把它抵消掉,所以

1
2
pathMask(u,v) = upMask[u] ^ upMask[v];     // O(1)

整条路径上恰好出现一次的边,正好就是 u-v 之间的那条简单路径。

  • 预处理:一次 DFS,O(n)。

  • 查询:连 LCA 都不用求,完全 O(1)。

AC代码

心路历程(WA,TLE,MLE……)