hiho1576 子樹中的最小權值 dfs序

2021-08-08 10:50:27 字數 1516 閱讀 7313

題意:求以x為根的子樹中的最小權值

思路:dfs序,把樹轉化成乙個序列,類似lca中的轉化,記錄1棵子樹進去的時間戳和出去的時間戳。線段樹求區間最小值

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define lson(x) 2*x

#define rson(x) 2*x+1

typedef long long ll;

typedef pairpii;

const int maxn = 100005;

int in[maxn],out[maxn];

struct edge

edge[maxn];

int head[maxn],tot,t;

int a[maxn],num[maxn];

void init()

void add(int x,int y)

void dfs(int x)

out[x] = t;

}struct data

node[maxn*4];

void pushup(int cnt)

void build(int x,int y, int cnt)

int mid = (x+y) / 2;

build(x,mid,lson(cnt));

build(mid+1,y,rson(cnt));

pushup(cnt);

}void up(int x,int y,int cnt,int val)

int mid = (node[cnt].l + node[cnt].r) / 2;

if(y <= mid)

up(x,y,lson(cnt),val);

else if(x >= mid+1)

up(x,y,rson(cnt),val);

else

pushup(cnt);

}int fid(int x,int y,int cnt)

int mid = (node[cnt].l + node[cnt].r) / 2;

if(y <= mid)

return fid(x,y,lson(cnt));

else if(x >= mid+1)

return fid(x,y,rson(cnt));

else

return min( fid(x,mid,lson(cnt)) , fid(mid+1,y,rson(cnt)));

}int main(void)

dfs(1);

build(1,n,1);

int q;

scanf("%d",&q);

while(q--)

else

}} return 0;

}

hiho 1050 樹中的最長路

時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述上回說到,小ho得到了一棵二叉樹玩具,這個玩具是由小球和木棍連線起來的,而在拆拼它的過程中,小ho發現他不僅僅可以拼湊成一棵二叉樹!還可以拼湊成一棵多叉樹 好吧,其實就是更為平常的樹而已。但是不管怎麼說,小ho喜愛的玩具又...

hiho 1050 樹中的最長路

題目大意 給出一棵樹,其中每兩個節點都可以形成乙個路徑 要求路徑中的邊只能走一次 求出所有路徑中的長度最大值。分析 由於樹的任何乙個節點均可以作為根節點,因此dfs時候,選擇1即可。實現 pragma once pragma execution character set utf 8 本檔案為utf...

C 中BackgroundWorker的最簡單用法

c 使用不太多,但是總是要用上線程,比如後台跑個什麼函式,讓程式不要卡死之類的,以前總用thread,後來發現了backgroundworker這個好東西。剛入門接觸這玩意兒,用的不熟,這次先貼個最簡單的backgroundworker用法吧。backgroundworker worker new ...