給出一棵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的路徑 ...