洛谷P3258松鼠的新家

2022-04-30 10:39:14 字數 1413 閱讀 1837

題目傳送門

恩,很明顯的乙個樹剖題,配合樹上差分其實也並不難,不過無奈蒟蒻樹剖還沒那麼熟練,而且樹上差分也做的少,所以這題愣是做了一中午。。。。。。唉,果然我還是太菜了。恩,具體做法在**中解釋吧:

//it is made by holselee on 6th jan 2018

#include#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

const

int n=300030

;int

n,a[n],c[n],ans[n],head[n],cnt;

intsum,hson[n],size[n],fa[n],id;

intdepth[n],top[n],dfn[n],xu[n];

struct

nodeedge[n

<<1

];inline

intread()//快讀

while(ch>='

0'&&ch<='9')

return flag?-num:num;

}inline

void add(int x,int

y)//加邊

//兩個dfs,樹剖套路,不解釋

inline

void dfs1(intu)}

inline

void dfs2(int u,int

nowtop)

}inline

void lca(int x,int

y)//求lca

c[dfn[fax]]++;c[dfn[x]+1]--;

//在深度較淺的點++,較深的點--,差分x=fa[fax];fax=top[x];

} if(depth[x]c[dfn[y]]++;c[dfn[x]+1]--;

//同上

}void

ready()

//加邊,這裡不需要用a陣列

//從樣例分析就可以知道,加邊的序號是房間原本的編號

depth[

1]=1;fa[1]=0

; dfs1(

1);dfs2(1,1);}

void

work()

sum=0;

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

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

printf(

"%d\n

",ans[i]);

//輸出,完結

return;}

intmain()

總的來說,這是一道用來練習樹剖和樹上差分的好題。

洛谷P3258松鼠的新家

松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請小熊維尼前來參觀,並且還指定乙份參觀指南,他希望維尼能夠按照他的指南順序,先去a1,再去a2,最後到an,去參觀新家。可是...

P3258 松鼠的新家

description 題面 給你一張 n 個節點的樹和乙個遍歷的順序,必須按照順序走,求每個點被經過多少次,最後到達的點不計算次數 solution 樹上差分的裸題,只需要做點差分就行了。對於路徑上相鄰兩點做點差分會發現有的點被統計兩次,所以對於第 2 n 1 個經過的點標記一下,最後 dfs 的...

洛谷P3258 JLOI 2014松鼠的新家

題目 樹上差分 樹上點差分,注意會出現路徑端點多記錄的情況,這時需要在最後輸出的時候輸出子樹的差分陣列的和 1,而不是在處理原資料的時候減1。並且a n 不需要糖果,最後也減去就行。include define n 1001011 using namespace std struct edg e n...