闊力梯的樹

2021-10-07 22:45:43 字數 3321 閱讀 6322

題目描述

闊力梯有一棵樹,這棵樹有n

n個節點,每個節點按順序編號為1−n

1−n,其中,1

1號節點是根結點。

定義樹上乙個節點的「結實程度」為,將這個節點的子樹中的所有的節點編號拿出來之後,按照從小到大的順序排列,然後將相鄰元素做差之後求平方和。即假設子樹的節點編號排序後的序列為a1,

a2,a

3,..

.,ak

a_1,a_2,a_3,...,a_k

a1​,a2

​,a3

​,..

.,ak

​,這個節點的「結實程度」就是:∑i=

1k−1

(ai+

1−ai

)2

\sum\limits_^\left(a_-a_i\right)^2

i=1∑k−

1​(a

i+1​

−ai​

)2現在,闊力梯想要加固這棵樹,但是他的資源有限,不能加固所有的節點,所以他想知道每個節點的「結實程度」是多少。

輸入描述:

第一行乙個整數n(1

≤n≤1

05

)n\left(1\leq n\leq 10^5\right)

n(1≤n≤

105)

,表示節點數。

接下來第 2

2 到 n

n 行,第 i

i 行乙個整數 pi(

1≤pi

p_i\left(1\leq p_i pi

​(1≤

pi​,表示節點i的父親。

輸出描述:

n

n 行,第 i

i 行乙個整數,代表節點 i

i 的「結實程度」。

示例1

輸入51

111輸出

4000

0

示例2

輸入51

234輸出

4321

0

很裸的樹上啟發式合併,比較適合拿來練手。。

#include

#define si(a) scanf("%d",&a)

#define sl(a) scanf("%lld",&a)

#define sd(a) scanf("%lf",&a)

#define sc(a) scahf("%c",&a);

#define ss(a) scanf("%s",a)

#define pi(a) printf("%d\n",a)

#define pl(a) printf("%lld\n",a)

#define pc(a) putchar(a)

#define ms(a) memset(a,0,sizeof(a))

#define repi(i, a, b) for(register int i=a;i<=b;++i)

#define repd(i, a, b) for(register int i=a;i>=b;--i)

#define reps(s) for(register int i=head[s];i;i=next[i])

#define ll long long

#define ull unsigned long long

#define vi vector

#define pii pair

#define mii unordered_map

#define msi unordered_map

#define lowbit(x) ((x)&(-(x)))

#define ce(i, r) i==r?'\n':' '

#define pb push_back

#define fi first

#define se second

#define inf 0x3f3f3f3f

#define pr(x) cout<<#x<<": "namespace std;

inline

intqr()

while

(c >=

'0'&& c <=

'9')

return f * fu;

}using

namespace std;

const

int n =

1e5+10;

int head[n]

, ver[n <<1]

, next[n <<1]

, tot;

int son[n]

, dfn[n]

, s[n]

, id[n]

, num;

multiset<

int> st;

ll ans[n]

, now;

int n;

inline

void

add(

int x,

int y)

void

dfs(

int x,

int f)

}inline

void

add(

int x)

if(it == st.

end())

if(it == st.

begin()

)int vr =

*it, vl =

*--it;

now +

=1ll

*(vr - x)

*(vr - x)

+1ll

*(x - vl)

*(x - vl)

-1ll

*(vr - vl)

*(vr - vl)

; st.

insert

(x);

}void

dfs(

int x,

int f,

bool k)

if(son[x]

)dfs

(son[x]

, x,

true);

reps

(x)add

(x), ans[x]

= now;if(

!k)now =

0, st.

clear()

;}intmain()

dfs(1,

0);dfs(1

,0,true);

repi

(i,1

, n)

pl(ans[i]);

return0;

}

闊力梯的樹

樹上問題,樹鏈剖分,lca變成線性,點分治,點分樹,dsu on tree 這道題是 dsu on tree,還是要用時間戳這個好東西,可以維護子樹 然後就是加子樹入編號影響的問題,用set維護就好了 int n,m,k,cas vi h n int dfn n low n df,son n sz ...

闊力梯的樹 樹上啟發式合併 set

傳送門 人都傻了 d su dsuds u倒是模板,被set setse t的操作搞暈了 s l ower bou nd i nt s.lower bound int s.lowe r bo und int 返回乙個大於等於查詢元素的指標 s e nd s.end s.end 是se tset se...

04 06 梯度提公升樹

目錄 三 回歸梯度提公升樹流程 四 梯度提公升樹優缺點 五 小結 人工智慧從入門到放棄完整教程目錄 梯度提公升樹 gradien boosting decision tree,gbdt 在工業上用途廣泛,屬於最流行 最實用的演算法之一,梯度提公升樹可以看成是提公升樹的優化版。梯度提公升樹和提公升樹 ...