Codeforces 437D 貪心 並查集

2022-05-22 15:09:09 字數 1199 閱讀 3131

這個題目讓我想起了上次在湘潭賽的那道跪死了的題。也是最值問題,這個也是,有n個動物園 每個都有權值 然後被m條路徑相連線,保證圖是連通的,然後求所有的p[i][j]之和.i,j為任意兩個zoo,pij就為i到j路上遇到的包括i j在內的最小權值的zoo

然後我就焦頭爛額了一下,這個明顯就是看某個最小值為最後的結果發揮了多少次作用,但這個是圖,要知道某個節點到底給多少條路徑貢獻出了最小值,還真是有點沒頭緒(在已知的複雜度一看 最多只能用nlogn的),最後是看了解答才知道的

用並查集來解決某個最小值到底出現多少次,首先 其實不要被點弄得迷糊了,先落實到邊權值來,每條邊的權值就等於兩個端點中那個小的,然後我們可以發現最大的邊,僅僅只會對兩個端點的那條路產生影響,然後次大的邊,會對自己 以及他的鄰邊若是最大邊,也會產生影響。

這就要用到並查集了,首先所用的點都是獨立集,然後從最大的邊開始,如果兩個端點不在乙個集合,便並在一起,並且這次邊產生的影響次數 為 rank[r1]*rank[r2],用乘法原理得出,因為是降序的,已經合併起來的點,全都是經歷了更長的邊,所以用乘法原理,當前兩個端點所在集合的個數互乘一下,便是此刻的邊產生的影響次數。

這樣一下來,便可算出結果。

不得不是,並查集雖然寫起來簡單,真的是奧妙無窮。

#include #include 

#include

#include

using

namespace

std;

const

int n = 200000+10

;struct

node

}e[n];

inta[n];

intf[n],sum[n];

intcnt,n,m;

void add(int a,int

b)int findset(int

x)int

main()

inta,b;

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

sort(e,e+m);

double ans=0

;

for (int i=0;i)

}ans*=2.0

; ans/=(double)(n*1.0*(n-1

)); printf(

"%.6lf\n

",ans);

}return0;

}

codeforces1141D題解 暴力 貪心

給出兩個長度為 n 1 n 150000 的僅含有小寫字母和 的字串,詢問兩個字串最多能有幾對匹配的字元。每個字母都可以與和它相同的字元匹配,可以與任意字元匹配,匹配與位置無關 輸出最大匹配對數,以及每一對中兩個字元在字串中的位置 cf1141d created by hao on 2019 4 1...

Codeforces 703D 樹狀陣列

codeforces 703d 題意 給1e6長度的區間,每個單位代表乙個數。給1e6個詢問,每次問區間內出現次數為偶數次的數異或和。思路 賽中的時候想莫隊水過去,結果pretest都沒過233 正解是樹狀陣列。首先假設是奇數次的話,就是乙個簡單字首和。現在偶數次,有乙個處理技巧就是記錄這個區間出現...

codeforces 912D 期望計算

題目鏈結 題意 在乙個n m的魚塘裡面放置k條魚,每次可以選定乙個r r的矩陣並獲得矩陣內魚的數量的分數。請問該如何在魚塘裡面放置魚,使得最後的期望得分最大。思路 直接通過列舉放置魚的位置計算期望得分明顯非常非常不現實,於是我們換一種計算思路我們去計算各點放置魚之後可以得到的期望得分,然後取前k大的...