題目描述
闊力梯有一棵樹,這棵樹有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 在工業上用途廣泛,屬於最流行 最實用的演算法之一,梯度提公升樹可以看成是提公升樹的優化版。梯度提公升樹和提公升樹 ...