題目大意:建乙個圖,然後算出可以互相到達的點的最大值乘以二者位運算的結果的和。
題目思路:先通過並查集把可以互相到達的點放在一起。然後對每個並查集內部進行排序,因為是最大值乘以二者位運算結果的和,所以排序後就是後面的值乘以與前面所有值的位運算結果的和。然後就是對位運算的理解。舉個例子。比如11*(11&7)可以看作11*((1+2+8)&(1+2+4))與是同一位都為1才為1,那麼8和4都是獨有的就變成0了,原式就變成了11*(1+2)。由此我們可以把前面所有的每一位有幾個都算出來,有幾個就是要用1《以下是**:
#include #include#include#include#includeusing namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int mod=1e9+7;
vectorv[maxn];
int pre[maxn],a[maxn],e[32];
int find(int x)
int main()
}rep(i,1,n)
ll ans=0;
rep(i,1,n)
}per(j,len-1,0)}}
ans=(ans+mod)%mod;
printf("%lld\n",ans);
}return 0;
}
HDU 6411 帶勁的and和 並查集 位運算
題目鏈結 略n 1e5的資料規模肯定是不能直接列舉兩個相連的點的。既然題目中用到了位運算,就要從二進位制的角度來考慮。對於乙個連通分量,我們將其中的所有點按照權值排序,這時候再暴力列舉的話,肯定是最大的點和其他點分別來做與運算,然後次大的點和比它小的點做與運算。從位運算的角度思考,只有兩個數相同二進...
HDU3938 並查集 並查集
先按邊權值排個序,每次加入一條邊,用並查集,關鍵看懂題。include include include include using namespace std const int maxn 10010 int n,m,q struct edge edges maxn 5 inline int cmp...
hdu 拓撲排序 並查集
題目大意 有一些池塘,每乙個池塘都有乙個價值,現在想刪除一些池塘。有如下刪除條件 1 乙個池塘有兩個管道連線的不可以刪除。2 求最後剩下的為奇數環的池塘的價值。先用拓撲排序的思路將兩個一下連線的全刪除 只有用並查集統計數目 includeusing namespace std define ll l...