Relief grain 樹鏈剖分

2022-05-01 14:00:08 字數 2138 閱讀 2823

又是非常好的樹鏈剖分

題意

有n個點的樹,有m次操作

操作是在x-y的鏈上的每乙個點,放入乙個數字z

然後讓你輸出每個點出現次數最多的數是什麼

首先將其看成乙個序列操作(也就是樹鏈拆成的一條條鏈)

要在 u 到 v 之間加上 數字z  那麼就  d[u].pb(z)   d[v+1].pb(z)   (有點像差分  但是和差分又不一樣)

並且記錄乙個maxz

然後開乙個線段樹   1 到maxz 

從該序列的頭開始遍歷 (頭不可能有 -z  ) 

然後就是最大值線段樹  答案就是最大值的下標   注意可以加乙個maxnum 遞迴返回其結果 (具體實現見線段樹!!!!)

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define see(x) (cerr<

#define lson l,m,pos<<1

#define rson m+1,r,pos<<1|1

#define inf 0x3f3f3f3f

#define clr(a,v) memset(a,v,sizeof a)typedef pair

pii;

/////////////////////////////////

/const

int n=1e5+10

;int t[n<<2],maxnum[n<<2],pos,head[n<<1

],n,m;

void up(int

pos)

void build(int l,int r,int

pos)

int m=(l+r)>>1

; build(lson);build(rson);up(pos);

}void upnode(int x,int v,int l,int r,int

pos)

int m=(l+r)>>1

;

if(x<=m)upnode(x,v,lson);

else

upnode(x,v,rson);

up(pos);

}int

cnt,id[n],fa[n],top[n],siz[n],son[n],dep[n],ans[n],a,b,c;

vector

d[n];

struct

edge

edge[n

<<1

];void add(int a,intb);

head[a]=pos;

}void dfs1(int x,intf)}

void dfs2(int x,int

topf)

}void up(int x,int y,int

v)

if(dep[x]>dep[y])swap(x,y);

d[id[x]].push_back(v);

d[id[y]+1].push_back(-v);

}void

init()

intmain()

ans[i]=maxnum[1

];

if(t[1]==0)ans[i]=0

; }

rep(i,

1,n)

printf(

"%d\n

",ans[id[i]]);

rep(i,

1,n+5

)d[i].clear();

}return0;

}

view code

樹鏈剖分 樹鏈剖分講解

好了,這樣我們就成功解決了對樹上修改查詢邊權或點的問題。下面放上 vector v maxn int size maxn dep maxn val maxn id maxn hson maxn top maxn fa maxn 定義 int edge 1,num 1 struct tree e ma...

演算法入門 樹鏈剖分 輕重鏈剖分

目錄 3.0 求 lca 4.0 利用資料結構維護資訊 5.0 例題 參考資料 資料結構入門 線段樹 發表於 2019 11 28 20 39 dfkuaid 摘要 線段樹的基本 建樹 區間查詢 單點修改 及高階操作 區間修改 單點查詢 區間修改 區間查詢 標記下傳 標記永久化 閱讀全文 樹鏈剖分用...

樹鏈剖分 樹剖換根

這是一道模板題。給定一棵 n 個節點的樹,初始時該樹的根為 1 號節點,每個節點有乙個給定的權值。下面依次進行 m 個操作,操作分為如下五種型別 換根 將乙個指定的節點設定為樹的新根。修改路徑權值 給定兩個節點,將這兩個節點間路徑上的所有節點權值 含這兩個節點 增加乙個給定的值。修改子樹權值 給定乙...