一開始沒讀懂題,好不容易讀懂了還不會做。
題意:小樹x(g)的點集是g的邊集(即原樹的邊對應變成小樹的點);
在「小樹」中,兩點之間有邊,當且僅當這兩個點對應的邊在原圖上有公共點(即小樹的兩個點之間是否有邊取決於原樹中對應的兩個邊之間是否有公共點)
問題是讓求 x(x(g)) 有多少個點,我們可以知道 x(x(g)) 點的個數等於 x(g) 邊的個數。
那麼我們來思考一下如何求 x(g) 邊的個數?
考慮從g圖到x(g)建邊的過程,會發現:g中同乙個節點有多個邊時,這些邊在 x(g) 中轉成的點要相互連邊。
那麼我們只需要用乙個陣列a[i]
維護第i
個節點的度數,那麼第i
個節點對答案的貢獻就是組合數c(a[i],2)
,直接統計答案即可。
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int mod =
10000007
;const
int inf =
0x3f3f3f3f
;const
double pi =
acos(-
1.0)
;const
int maxn =
100010
;int a[maxn]
;//vectoradj[n];
intmain()
ll ans =0;
for(
int i =
1; i <= n; i++
) ans +
= a[i]
*(a[i]-1
)/2;
printf
("%lld\n"
, ans)
;return0;
}
牛客20180601練習賽19 E
已知第i個瓶子的品牌為ai,且其能開啟bi品牌的瓶子.問有幾瓶飲料托公尺無法喝到.被用於開啟飲料瓶的瓶子不一定需要被開啟.乙個瓶子不能開啟其本身.輸入描述 第一行乙個整數n,表示飲料的瓶數.接下來n行,每行兩個整數ai,bi.輸出描述 輸出一行乙個整數,表示小托公尺無法喝到的飲料瓶數.示例1 輸入 ...
牛客小白月賽19
a 水 滔天巨浪 includeusing namespace std int n int a 10004 b 100004 int main int ans 0 int hh 0 a 0 0 a n 1 1001 for int i 1 i n i printf d n hh b 木 迷霧森林 i...
牛客小白月賽43 E
有數字 1 9,每個數字的個數分別為 cnt1,cnt2,cnt3,cnt9。計算出 滿意的集合 的個數。滿意的集合 定義 選出的數存在一種排列方式,其拼接起來後表示的十進位制整數,能被 3整除,例如集合 包含了 2 個數字 3,1 個數字 6 可以有排列 代表十進位制下的整數 633,能被 3 整...