BZOJ1316 樹上的詢問

2022-05-19 19:33:05 字數 1065 閱讀 7464

給出一棵n個點的帶邊權有根樹

有q個詢問,每個詢問輸入len,判斷在樹上是否存在長度為len的路徑

直接點分治,用set儲存鏈的長度就行了

#include#include

#include

#include

#include

#include

#define maxn 11000

#define inf 1<<30

using

namespace

std;

struct nodea[maxn*2];int

len,last[maxn];

void ins(int x,int y,int c);last[x]=len;}

intms[maxn],sum,tot[maxn],rt;

bool

v[maxn];

sets;

void getrt(int x,int

fa) ms[x]=max(ms[x],sum-tot[x]);

if(ms[x]x;

}int

dep[maxn],q,q[maxn];

intp[maxn];

void cal(int x,int fa,intd)}

void add(int x,int fa,intd)}

void solve(int

x) s.clear();

for(int k=last[x];k;k=a[k].next)

}int

main()

memset(v,

false,sizeof

(v));

rt=0;sum=ms[rt]=n;getrt(1,0

); memset(p,

false,sizeof

(p));

for(int i=1;i<=q;i++) scanf("

%d",&q[i]);

solve(rt);

for(int i=1;i<=q;i++)

return0;

}

BZOJ 1316 樹上的詢問 樹分治

按理來說是乙個非常簡單的樹分治,我只是為了將專題的時候作為一道引入題目的,不過,我擦set和map的常數差別有那麼大嗎,map居然比set慢了10倍,然後就一直t啊一直t最後看他們都用的set改過來就a了,我也是鬱悶。方法很簡單,用set記錄乙個長度有沒有出現過,然後每次樹分治統計 include ...

BZOJ 1316 樹上的詢問 點分治

time limit 10 sec memory limit 162 mb submit 691 solved 187 submit status discuss 一棵n個點的帶權有根樹,有p個詢問,每次詢問樹中是否存在一條長度為len的路徑,如果是,輸出yes否輸出no.第一行兩個整數n,p分別表...

BZOJ1316 樹上的詢問 點分治

一棵n個點的帶權有根樹,有p個詢問,每次詢問樹中是否存在一條長度為len的路徑,如果是,輸出yes否輸出no.第一行兩個整數n,p分別表示點的個數和詢問的個數 接下來n 1行每行三個數x,y,c,表示有一條樹邊x y,長度為c 接下來p行每行乙個數len,表示詢問樹中是否存在一條長度為len的路徑 ...