傳送門
此題樹剖可過
然而可以樹上差分為什麼要樹剖..
對於一條路徑(a,b),只要把 val [ a ] ++ , val [ b ] ++ , val [ lca(a,b) ] -- , val [ fa[lca(a,b)] ] --
那麼求每個點的經過次數就求一下子樹 val 的和就好了
但是要注意,每一條路徑的終點是下一條路徑的起點,那些點會被多算一次
所以求完子樹和以後要再把那些點 val--
**很簡單
#include#include#include
#include
#include
using
namespace
std;
const
int n=6e5+7
;inline
intread()
while(ch>='
0'&&ch<='
9')
return x*f;
}int fir[n],from[n<<1],to[n<<1
],cnt;
inline
void add(int &a,int &b)
intn;
int dep[n],f[n][27];//
lca的陣列
void dfs1(int x,int fa)//
dfs1預處理f和dep
}inline
int lca(int x,int y)//
求lca
inta[n],sum[n];
void dfs2(int x)//
dfs2求子樹和
}int
main()
dfs2(1);
for(int i=2;i<=n;i++) sum[a[i]]--;//
減去重複算的
for(int i=1;i<=n;i++)
printf(
"%d\n
",sum[i]);
return0;
}
P3258 JLOI2014 松鼠的新家
松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請 前來參觀,並且還指定乙份參觀指南,他希望 能夠按照他的指南順序,先去a1,再去a2,最後到an,去參觀新家。可是這樣會導...
洛谷P3258 JLOI 2014松鼠的新家
題目 樹上差分 樹上點差分,注意會出現路徑端點多記錄的情況,這時需要在最後輸出的時候輸出子樹的差分陣列的和 1,而不是在處理原資料的時候減1。並且a n 不需要糖果,最後也減去就行。include define n 1001011 using namespace std struct edg e n...
洛谷P3258 JLOI2014 松鼠的新家
松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請 前來參觀,並且還指定乙份參觀指南,他希望 能夠按照他的指南順序,先去a1,再去a2,最後到an,去參觀新家。可是這樣會導...