1. 程式人生 > >uoj 176 新年的繁榮

uoj 176 新年的繁榮

題目傳送門

  傳送門

題目大意

  每個點有一個點權$a_i$,連線點$u$和點$v$的邊的邊權是$a_u\ and\ a_v$,問最大生成樹。

  我們從大到小考慮每一種邊權,如果兩個未連通的點的點權同時包含這個邊權作為子集,顯然用這樣的邊連線這些點最優。

  因此每一種已經考慮過的邊權,我們用並查集取一個代表元。

  每列舉到一個新的邊權就嘗試合併一些已有的連通塊。

Code

 1 /**
 2  * uoj
 3  * Problem#176
 4  * Accepted
 5  * Time: 1128ms
 6  * Memory: 3276k
 7
*/ 8 #include <iostream> 9 #include <cstdlib> 10 #include <cstdio> 11 #ifndef WIN32 12 #define Auto "%lld" 13 #else 14 #define Auto "%I64d" 15 #endif 16 using namespace std; 17 typedef bool boolean; 18 19 #define ll long long 20 21 template <typename T> 22 void
pfill(T* pst, const T* ped, T val) { 23 for ( ; pst != ped; *(pst++) = val); 24 } 25 26 int n, m; 27 int S; 28 int *f, *ar; 29 ll res = 0; 30 31 int find(int x) { 32 return (f[x] == x) ? (x) : (f[x] = find(f[x])); 33 } 34 35 inline void init() { 36 scanf("%d%d", &n, &m);
37 S = 1 << m; 38 f = new int[S]; 39 ar = new int[S]; 40 pfill(ar, ar + S, 0); 41 for (int i = 1, x; i <= n; i++) { 42 scanf("%d", &x); 43 if (!ar[x]) 44 f[x] = x, ar[x] = x; 45 else 46 res += x; 47 } 48 } 49 50 inline void solve() { 51 for (int s = S - 1, x, y; s; s--) { 52 for (int i = 0; !ar[s] && i < m; ar[s] |= ar[s | (1 << (i++))]); 53 if (!(x = ar[s])) 54 continue; 55 for (int i = 0; i < m; i++) 56 if (ar[s | (1 << i)]) { 57 y = find(ar[s | (1 << i)]); 58 if (y ^ find(x)) { 59 f[y] = find(x), ar[s] = find(x); 60 res += s; 61 } 62 } 63 } 64 printf(Auto, res); 65 } 66 67 int main() { 68 init(); 69 solve(); 70 return 0; 71 }

相關推薦

uoj #176. 新年繁榮 字典樹+Boruvka演算法

題意 有n個點,第i個點的權值為a[i],在第i個點和第j個點之間連邊的代價為a[i] and a[j]。問這個圖的最大生成樹。 n<=100000,a[i]<218n<=100000,a[i]<218 分析 這題我們可以用最

uoj 176. 新年繁榮

題意: 給出一個完全圖,邊權為兩點權值的and,求最大生成樹。 題解: 這題用最小生成樹的Boruvka演算法。 大概就是每次找到每一個聯通塊權值最大的邊,將這些聯通塊合併,直到只剩一個聯通塊。因為每次聯通塊的個數至少減半,所以只會做log次操作。 那

uoj 176 新年繁榮

題目傳送門   傳送門 題目大意   每個點有一個點權$a_i$,連線點$u$和點$v$的邊的邊權是$a_u\ and\ a_v$,問最大生成樹。   我們從大到小考慮每一種邊權,如果兩個未連通的點的點權同時包含這個邊權作為子集,顯然用這樣的邊連線這些點最優。   因此每一種已經考慮過的

UOJ176 新年繁榮【多路增廣生成樹】

題目連結: 新年的繁榮 題目大意:任意兩點之間邊的邊權是兩點點權的與,求邊權和最大生成樹 題目分析:每一次對一個連通塊找一條出邊(不連向自己),邊權最大的同時所連的連通塊編號最小,這些邊去重後一定不會形成環,且每次至少減少一半的連通塊,因此迭代複雜度為log

UOJ#67 新年的毒瘤 tarjan

-s digi def git 傳送門 ont dig main max 題目傳送門 題意:給出一個$N$個點、$M$條邊的無向圖,找出其中的點,滿足去掉該點與和它相連的邊之後,這個圖會變成一棵樹。$N , M \leq 10^5$ 說是毒瘤,真的不毒瘤 思考一下,我們需

UOJ#351. 新年的葉子 概率期望

原文連結https://www.cnblogs.com/zhouzhendong/p/UOJ351.html 題目傳送門 - UOJ351 題意   有一個 n 個節點的樹,每次塗黑一個葉子節點(度為 1 的節點),可以重複塗黑。   問使得白色部分的直徑發生變化的期望塗黑次數。   $n\leq

uoj #177. 新年的腮雷

題面 題解 早上寫了一篇,就還想再寫一篇 挺不錯的一個題 先來講講部分分吧 第一檔13分的很簡單,直接爆搜就可以了 第二檔11分的也很簡單,直接排個序就可以了 然後有一檔6分的,m=2,b={1,1}

UOJ #351. 新年的葉子

題面 題意 給出一棵樹,每次隨機選擇一個葉子節點(可以重複選),將其染黑,問樹上不經過黑點的最長鏈變短的期望染色次數是多少。 做法 這題的主要思路是用總代價除以總方案數。 樹的直徑有一個或兩個必經點,當

UOJ #351.新年的葉子(數學題?)

題意 給一棵樹,每次可以染色一個葉子(只能是原樹上的葉子,且每個葉子可以染色多次),求使不經過被染色的節點的直徑減小的期望步數。 思路 可能會有點長,大概的理一理。 一、求直徑 nothing to say。走流程。 二、分集合 然後開始觀察這棵樹。直徑可能有多

uoj 175. 新年的網警

題意: 在這新年的第一天,猴族首領猴腮雷打算來整治一下網路風氣。這時,他聽說在一個叫做 Universal OJ 使用者群 的 QQ 群中有人在散播(開)謠言(車),於是他就派了一群網警把這個使用者群裡的人都抓了回來,試圖找到謠言的源頭。 這個使用者群中有

UOJ#351.新年的葉子

瞎bb noip全真模擬賽又掛了。。 出題人居然又賀了三道原題。。 T3.走向巔峰新年的葉子//原題連結 被出題人魔改之後的題面… T1暴力T2爆蛋,,於是只好來做T3 思路 樹的多條直徑一定會相交 所以我們用最暴力的做法(去考提高的應該都會吧 先隨便選一個

UOJ 67 新年的毒瘤

割點 非割點且度數=m-n+2的就是答案。 割點竟然沒一次寫對,智商已降低。 設根為1。對於非1節點,一定有父親的邊,則它是割點的充要條件是存在一個兒子的low>=自己的dfn。對於1節點,

[UOJ#461]新年的Dog劃分[二分圖染色、二分]

pan 一個 操作 mat 邊集 題意 中一 https 黑白 題意 給你一張無向連通圖,你並不知道有哪些邊,你首先要回答這張圖是否是二分圖,如果是,回答這張圖黑白染色過後的任意一個點集。你需要在2000次詢問內找到結果,每次你可以詢問原圖中一個邊集刪掉後是否還連通。 \(

UOJ#67】新年的毒瘤(Tarjan)

con space spa href print class ble cpp == 【UOJ#67】新年的毒瘤(Tarjan) 題面 UOJ 題解 一棵\(n\)個節點的樹顯然有\(n-1\)條邊,在本題中意味著刪去一個點之後還剩下\(n-2\)條邊。那麽找到所有度數為\(

UOJ 351】新年的葉子

Description 對於一棵樹,每次隨機染黑一個葉子(可能會重複染黑),期望多少次後直徑變小?. Solution 其實這題正確的題意應該是:對於每種直徑與原圖不同的染色方案,在第多少步時直徑變小,求期望嗎, 也就是:我們會不停的染色下去,每種方

uoj176 新年繁榮

pac 高位到低位 所有權 過程 合並 uoj main http time 鏈接:http://uoj.ac/problem/176 對於這種邊權難以直接維護的都直接考慮brouvka算法。 顯然,我們要做的是實現一個可以查詢&x最大的數據結構。 可以先對於所有權

UOJ176新年繁榮

中聯通 code ret getch ostream 怎麽辦 iostream read def 題目鏈接 Boruvka生成樹算法 \(Boruvka\)算法就是先把每個點看作一個聯通塊,然後不斷在聯通塊之間找最優的邊進行合並。因為每次聯通塊的數量最少縮小一半。所以合並次

[UOJ #222][NOI2016]區間(線段樹)

ont 線段樹 div 最短 ans oid tro lib read Description 在數軸上有 n個閉區間 [l1,r1],[l2,r2],...,[ln,rn]。現在要從中選出 m 個區間,使得這 m個區間共同包含至少一個位置。換句話說,就是使得存在一個 x

UOJ#204 【APIO2016】Boat

submit word namespace content bmi string 參加 預處理 兩個 Time Limit: 70 Sec Memory Limit: 256 MBSubmit: 559 Solved: 248 Description 在首爾城中

UOJ #206. 【APIO2016】Gap

msu 一行 本地 信息 erl nbsp lns 有趣的 ref 有 NN 個嚴格遞增的非負整數 a1,a2,…,aNa1,a2,…,aN(0≤a1<a2<?<aN≤10180≤a1<a2<?&l