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