HDU 6411 帶勁的and和 並查集 位運算

2022-06-08 03:21:10 字數 767 閱讀 4751

題目鏈結

略n=1e5的資料規模肯定是不能直接列舉兩個相連的點的。既然題目中用到了位運算,就要從二進位制的角度來考慮。

對於乙個連通分量,我們將其中的所有點按照權值排序,這時候再暴力列舉的話,肯定是最大的點和其他點分別來做與運算,然後次大的點和比它小的點做與運算。。。從位運算的角度思考,只有兩個數相同二進位制位上的數字都是1的時候,這位與運算的結果才是1,把每個數字按二進位制位分解,然後按二進位制位取字首和,就能優化列舉的時間。

const int maxn = 1e5+10;

const int maxm = 1e5+10;

vectorbcc[maxn];

int p[maxn], v[maxn], tmp[maxn], pre[maxn][32];

int n, m;

int find(int x)

int main()

for (int i = 1; i<=n; ++i) bcc[find(i)].push_back(v[i]);

ll ans = 0;

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

if (bcc[i].size()>1)

for (int j = 1; j>k&1) ans = (ans+tmp[j]*((1ll<}

cout << ans << endl;

for (int i = 0; i<=n; ++i) bcc[i].clear();

}return 0;

}

HDU 6411 並查集 位運算

題目大意 建乙個圖,然後算出可以互相到達的點的最大值乘以二者位運算的結果的和。題目思路 先通過並查集把可以互相到達的點放在一起。然後對每個並查集內部進行排序,因為是最大值乘以二者位運算結果的和,所以排序後就是後面的值乘以與前面所有值的位運算結果的和。然後就是對位運算的理解。舉個例子。比如11 11 ...

帶勁的and和 (並查集找聯通 二進位制運算)

度度熊專門研究過 動態傳遞閉包問題 他有一萬種讓大家爆蛋的方法 但此刻,他只想出一道簡簡單單的題 至繁,歸於至簡。度度熊有一張n個點m條邊的 無向圖 第ii個點的點權為vivi。如果圖上存在一條 路徑 使得點ii可以走到點jj,則稱i,ji,j是 帶勁 的,記f i,j 1f i,j 1 否則f i...

hdu 1272 使用set和並查集

這道題就是求圖是不是連通無環,我覺得其實就是看看圖是不是一棵最小生成樹。所以要是圖滿足條件,就必然有n個節點,n 1條邊。但是題目中若只有 0 0一組資料也是可以的!這裡wa了好多回。所以我首先採用stl裡面的set來直接判斷 include include include include incl...