BZOJ3631 松鼠的新家 樹上差分 點差分

2021-09-26 23:18:08 字數 869 閱讀 2409

n(n<=3e5)個點的一棵樹,給出a1到an,

從a1走到a2,再從a2走到a3,從a3走到a4,...,從an-1走到an

要求,走的路徑上每走乙個點放乙個糖果,最後an不放,

問每個點放了多少糖果

裸的樹上點差分,a1走到a2,就把這一條路徑+1即可

由於後續又把a2走到a3的路徑+1,故需要對a2單點減一,減去重複

可知,a2到an這n-1個點都需減去重複

#includeusing namespace std;

typedef long long ll;

typedef pairp;

#define pb push_back

const int n=3e5+10;

const int inf=0x3f3f3f3f;

int n,u,v,ans[n];

int a[n],dep[n],f[n][19];

vectore[n];

void dfs(int u,int fa)

return f[x][0];

}void add(int x,int y)//x到y的路徑 +1

void dfs2(int u,int fa)

}int main()

dfs(1,-1);init();

for(int i=1;iadd(a[i],a[i+1]);

dfs2(1,-1);

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

ans[a[i]]--;

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

printf("%d\n",ans[i]);

return 0;

}

bzoj3631 松鼠的新家

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

bzoj 3631 (樹上差分)

給你一棵有n n個結點的樹,現在給你乙個大小為n n的排列,說明你的行走路徑。你每經過樹上的每乙個點,你就需要將這個點的點權加1。問你最後所有點的點權大小。根據題目的意思,很明顯這道題是乙個非常典型的點差分的問題。我們只需要對結點uiu i vi vi 以及lca ui,vi l ca u i v ...

3631 JLOI2014 松鼠的新家

樹剖裸題。每次將a i 1 到a i 的路徑都加一,輸出時除了a 1 其他都減一即可。ps 線段樹小技巧 如本題有訪問所有葉子節點的值。只要把整棵樹遍歷一遍,訪問到葉子是記錄下就可以了,o n 然而並沒什麼用 code include include include includeusing nam...