树上差分


典型树上差分例题

前缀和差分讲解

tarjon_lca

例题:
Max Flow P

个人感悟:

1. tarjon

感觉tarjon算法巧妙的利用了数据结构--并查集,将直观的寻找lca 的思想方法实习出来,在实现tarjon算法的过程中我对dfs的理解又加深了,dfs“去”和“回”的代码空间可以实现不同的功能顺序;

2. 树上差分和树上前缀

首先,树上前缀必须从下往上,因为从上往下会导致枝蔓变化,从下往上是单一路径。因此树上差分从下往上过程中是:父节点存储原父节点值减去所有原子节点值。

//https://www.luogu.com.cn/problem/P3128
//树上点差分的典型例题
//虽然K的值很大,但N的值也不小,所以这里采用tarjon的做法,如果无法通过
//更换为倍增的方法进行对比
#include
#define LOCAL
using namespace std;
const int maxn=5e4+10;
const int maxk=1e5+10;
vector link[maxn];
vector path[maxn];
int psr[maxn];  //presure-->psr
int vis[maxn];
int parent[maxn];
int fa[maxn];
int ans=0;
//read改良版
int read(){
    int s=0,f=1,c=getchar();
    while(c<'0' || c>'9') { if (c=='-') f=-1;c=getchar();}
    // while(c>='0' && c<='9') {s=s*10+c-'0';c=getchar();}
    while (c>='0' && c<='9') { s=(s<<3)+(s<<1)+c-'0'; c=getchar();}
    return f*s;
}
// union_find_set
int find(int p){
    return fa[p]=(fa[p]==p)?p:find(fa[p]);
}

// 不得不说,tarjon算法最令我惊喜的是并查集和fa[]数组的使用与dfs的结合(好吧,把tarjon直接说出来了)
// 这其中的细节其实是利用dfs很好的思想,让dfs的功能体现的很好!
void dfs_tarjon(int p,int frt){
    parent[p]=frt;
    int len=(int)link[p].size();
    for (int i=0;ians) ans=psr[frt];
}

int main(){
    #ifdef LOCAL
    freopen("input.txt","r",stdin);
    #endif
    int N=read(),K=read();
    for (int i=0;i