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以前,必須先安裝...