【前言】:今天是祖國母親70歲生日,請允許我向祖國母親說一聲:「生日快樂!願您永遠繁榮昌盛、山清水秀!」
【題意】:松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n
nn個房間,並且有n−1
n-1n−
1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在」樹「上。
松鼠想邀請小熊維尼前來參觀,並且還指定乙份參觀指南,他希望維尼能夠按照他的指南順序,先去a
1a_1
a1,再去a
2a_2
a2,…,最後到a
na_n
an,去參觀新家。可是這樣會導致維尼重複走很多房間,懶惰的維尼不停地推辭。可是松鼠告訴他,每走到乙個房間,他就可以從房間拿一塊糖果吃。
維尼是個饞傢伙,立馬就答應了。現在松鼠希望知道為了保證維尼有糖果吃,他需要在每乙個房間各放至少多少個糖果。
因為松鼠參觀指南上的最後乙個房間a
na_n
an是餐廳,餐廳裡他準備了豐盛的大餐,所以當維尼在參觀的最後到達餐廳時就不需要再拿糖果吃了。
【思路】:考慮到n
nn比較大(1≤n
≤3×1
05
1 \leq n \leq 3 \times 10^5
1≤n≤3×
105),不能直接暴力,所以我們考慮用樹上差分演算法。
注意,我們不能對邊差分,只能對點差分,即對於路徑(x,
y)
(x,y)
(x,y
)上所有點的經過次數+1+1
+1,則進行以下幾步(f
ff為差分陣列):f[x
]++,
f[y]
++,f
[lca
(x,y
)]−−
,f[f
a(lc
a(x,
y))]
−−
f[x]++,f[y]++,f[lca(x,y)]--,f[fa(lca(x,y))]--
f[x]++
,f[y
]++,
f[lc
a(x,
y)]−
−,f[
fa(l
ca(x
,y))
]−−【**】:
#include
using
namespace std;
const
int n=
301000
;struct nodee[n<<1]
;int h[n]
,tot;
inline
void
add(
int a,
int b)
;h[a]
=tot;
e[++tot]
=(node)
;h[b]
=tot;
}//鏈式前向星
#define gc getchar()
#define g(c) isdigit(c)
inline
intread()
//讀入優化的模板
int f[n][22
],dep[n]
;void
dfs_init
(int u,
int fa)
}inline
intlca
(int x,
int y)
if(x==y)
return x;
for(
int i=
20;i>=
0;i--)if
(f[x]
[i]!=f[y]
[i])
return f[x][0
];}int dp[n]
;void
get_answer
(int u)
}int n,x,y,i,a[n]
;int
main()
get_answer(1
);for(i=
2;i<=n;i++
) dp[a[i]]--
;//注意這裡哦
for(i=
1;i)printf
("%d\n"
,dp[i]);
printf
("%d"
,dp[n]);
return0;
}
2019 08 18 日常總結
一本通1599 題意 在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。fj 有 nn 只排成一排的奶牛,編號為 11 到 nn。每只奶牛的效率是...
5059日常總結
1.乙個函式的形參是const char 實參是可以是char 如果乙個函式的返回值是const char 不能用char 來接收返回值 2.為什麼沒有靜態的建構函式和析構函式?建構函式成員函式使用現有分配構造指定的物件 即存在this。static成員函式指定物件沒有儲存,因此沒有關聯的例項要構造...
2019 12 07日常總結
在昨天的日記裡,我們粗略的談了談二分。今天,我們來講講二分的乙個分支 二分答案。從巨集觀的角度來講,二分答案分為整數二分和實數二分。二者的區別就是二分的區間是整數還是實數而已。整數二分是二分答案的基礎,其形式多樣且較為簡單。下面以最小值最大為例,推薦一種筆者覺得很好的方法。while l r els...