牛客小白月賽23 G 樹上求和 題解(貪心)

2021-10-04 15:23:21 字數 902 閱讀 8228

其實這題自己有思路了,但是最後沒寫**卻去看了題解實屬不該。這題其實和周賽的一題很相似都是求貢獻

相似的周賽題

此題需要從算貢獻的角度思考,對於每條邊對答案的貢獻,等於其左邊子樹結點個數×右邊子樹結點個數×邊長。

因此我們先隨便從一點dfs,預處理出每個子樹的結點個數。再遍歷所有的邊。

把左邊子樹結點個數×右邊子樹結點個數的積儲存下來。從大到小排序,然後從前往後遍歷一遍分別乘上1/2/3/…/n-1,加起來即可。

時間複雜度o(n×log(n))。

找左右節點要要從大小排序,因為裡面總共有n個,但其實只有n-1條邊。裡面有乙個s[1]=0,肯定要捨去。

pass:雙向邊再不開兩倍把螢幕吃了

#include#includeusing namespace std;

typedef long long ll;

const int maxn=1e5+5;

ll ans,s[maxn],pos[maxn];

int head[maxn],cnt,cnt2,n,u,v;

struct nodee[maxn<<1];//雙向邊

void add(int u,int v)

void dfs(int son,int fa)

} s[++cnt2]=pos[son]*(n-pos[son]);//左節點數量乘以右節點數量

}bool cmp(ll a,ll b)

int main()

dfs(1,0);

sort(s+1,s+1+cnt2,cmp);//要從大到小因為裡面第乙個元素為0

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

printf("%lld",ans);

return 0;

}

牛客小白月賽23 樹上求和(思維)

有一棵包含n個節點和n 1條邊的樹,規定樹鏈 u,v 為樹上從u到v的簡單路徑。樹的每條邊上都有乙個正整數,這個正整數被稱作這條邊的顏色,規定一條樹鏈的權值w u,v 為這條樹鏈上所有邊的顏色的代數和。而整棵樹的權值為所有不同的樹鏈的權值的代數和。已知所有邊的顏色集合恰好為1到n 1這n 1個不同的...

牛客小白月賽23 部分題解

e 水題簽到 include using namespace std intmain j 水題 include using namespace std int a 100005 intmain sort a,a n cout a 0 i 題意 尋找字典序最大的子串 思路 遍歷兩個for,然後把所有的...

牛客小白月賽22題解

a 操作序列 單點增加,區間求和,下標最小的非零數變成零,單點查詢。說完了不就線段樹嘛。由於範圍比較大,先存下來,離散化,再進行樹上的操作。注意這裡的左右區間離散化值不一樣的,左邊離散化要找到大於等於左邊界的值,右邊離散化要找到小於等於右邊界的值。b 樹上子鏈 類似於 dp 求樹直徑 c 交換遊戲 ...