猴猴今天要和小夥伴猩猩比賽爬樹,為了公平不碰撞,猴猴和猩猩需要在不同的樹上攀爬。於是它們選了兩顆節點數同為n的樹,並將兩棵樹的節點分別以1~n標號(根節點標號為1),但兩棵樹的節點連線方式不盡相同。
現在它們決定選擇兩個標號的點進行比賽。為了方便統計,規定它們比賽中必須都向上爬。(即選定的賽段節點u→節點v都必須指向葉子方向)請你求出這兩棵樹上共有多少對節點滿足比賽的需求。
先求出第一棵樹的dfs
dfsdf
s序,得到每個節點本身的編號以及子樹的編號範圍[li
,ri]
[l_i,r_i]
[li,r
i] 。 用樹狀陣列來維護後面的計算。 在dfs
dfsdf
s處理第二棵樹時,我們每處理完乙個節點,就將該節點在第一棵樹中的對應編號設為1
11,處理完所有子節點後,查詢編號區間[li
,ri]
[l_i,r_i]
[li,r
i]的區間和,即當前子樹下,有多少個節點在樹1
11中也是當前節點的子孫節點。維護計數即可。
#include
#include
using
namespace std;
const
int n=
100000+5
;int n,cnt,ls[n]
,next[
2*n]
,v[2
*n];
inline
void
add(
int x,
int y)
int id,dfn[n]
,siz[n]
;void
pre(
int x,
int fa)
}int t[n]
,ans[n]
;void
change
(int x,
int num)
intask
(int x)
void
dfs(
int x,
int fa)
ans[x]
=ask
(dfn[x]
+siz[x]-1
)-ask(dfn[x]-1
);}int
main()
11 02 猴猴吃蘋果
走過的點的權值清零,那麼答案是唯一的,而且終點一定會是葉子節點 那麼我們設初始節點為根節點,先遍歷一次樹,把所有葉子節點記錄下來,以及每個點的父節點,按照深度排序 然後讓每個點沿著父親往上跳,每跳一步答案增加1,遇到根節點或者走過的節點就停止 遇到走過的點說明上面的點取過值了 include def...
11 02 猴猴吃香蕉
猴猴最愛吃香蕉了。每天猴猴出門都會摘很多很多的香蕉,每個香蕉都有乙個甜度,猴猴不一定要把所有的香蕉都吃掉,猴猴每天都有乙個心情值k,猴猴希望當天吃的香蕉滿足這麼乙個條件,這些香蕉的甜度乘積恰好等於k,但是猴猴並不知道有多少種方法,於是猴猴把這個問題交給你。揹包,依題目可得 只有k kk的約數才能作為...
51nod 猴猴的比賽
h yp erli nk hyperlink hyperl ink d es crip tion description descri ptio n 給定兩棵樹,求在兩棵樹同時滿足u uu是v vv的父親的對數 資料範圍 n 1 05 n leq 10 5 n 105sol utio nsoluti...