鏈剖 高階ing 填坑 NOIP2013 貨車運輸

2022-05-13 18:04:44 字數 1930 閱讀 8979

this article is made byjason-cow.

welcome to reprint.

but please post the writer's address.

#include #include 

#include

#include

using

namespace

std;

#define sizen 10

#define sizem 10

#define sizew 32767

#define sizeq 20

intmain()

int q=rand()%sizeq+10

; cout

while(q--)

return0;

}

似乎官方給的是倍增lca

不管了,最近練習鏈剖,以後有時間在補倍增的寫法

就是邊權下放成點權,然後樹鏈剖分套一顆線段樹就可以了

開始sb似的建成一顆大樹,其實直接利用kruskal的並查集查詢是否在同一子樹就好了[森林x1森林x2森林x3重要的事說三遍]

ac code 莫名壓行,不壓不爽

1

//邊權的下放,可能是這題唯一的細節吧

2 #include 3 #include 4

#define e(u,v,w) e[++cnt]=(edge),head[u]=cnt

5using

namespace

std;

6int

gi()

9while(c>='

0'&&c<='

9')x=x*10+c-'

0',c=getchar();

10return f?-x:x;11}

12const

int maxn=20000,maxm=80000;13

struct edgee[maxm*2

];14

struct dataa[maxm];

15int

n,m,q,head[maxn],cnt,f[maxn],vis[maxn];

16int find(int x)

17bool

operator

<(data x,data y)

18void add(int u,int v,int

w)19

void

kruskal()28}

29int

dfn[maxn],dep[maxn],fa[maxn],top[maxn],son[maxn],rak[maxn],siz[maxn],idx,w[maxn];

30void dfs1(int u,int

_fa)37}

38void dfs2(int u,int

_top)

44#define ls (x<<1)

45#define rs (x<<1|1)

46#define mid ((l+r)>>1)

47int min[maxn<<2

];48

void up(int x)

49void build(int x,int l,int

r)53

int min(int x,int l,int r,int l,int

r)60

int jump(int x,int

y)68

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

69 ans=min(ans,min(1,1,n,dfn[x]+1,dfn[y]));//

細節2

70return

ans;71}

72int

main()

高階 樹鏈剖分

之前寫過乙個基本的樹鏈剖分,但是我今天要講的高階版樹鏈剖分要能支援以下操作 其實還是板子題 其他的前置知識 樹狀陣列支援區間修改區間查詢 單純圖個方便 不會的話可以看這裡 說說高階其實也沒什麼東西。相較於我原來寫的 blog 只多了修改詢問子樹和換根的操作,但不得不說換根操作是真的妙,值得講一講。先...

noi2015 軟體包管理器 樹鏈剖分)

你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體包之間的依賴關係。而且,由於你之前的工作,除0號軟體包以外,在你的管理器當中...

Noi2015 軟體包管理器 樹鏈剖分

time limit 10 sec memory limit 512 mb submit 2411 solved 1397 submit status discuss 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝...