其實這題自己有思路了,但是最後沒寫**卻去看了題解實屬不該。這題其實和周賽的一題很相似都是求貢獻
相似的周賽題
此題需要從算貢獻的角度思考,對於每條邊對答案的貢獻,等於其左邊子樹結點個數×右邊子樹結點個數×邊長。
因此我們先隨便從一點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 交換遊戲 ...