首先,我們要建立的是乙個最小生成樹(跟最小生成樹其實沒關係),這些資料在位運算時有一些規律
1.兩個相同的數lowbit()結果為0,所以如果有兩個點的權值相同我們一定會讓他們兩個相連,由此,我們可以先對權值進行排序去重,去重後的權值個數是我們後面要計算的權值,那些相同的權值,因為我們要把它們連起來,並且他們的代價是0所以可以忽略.
2.下面再看如何使我們的lowbit整體代價最低,我們非常希望兩個數異或之後的數二進位制最右面那一位就是1,這樣的代價當然是最小的.所以我們想,只要有乙個數,他的二進位制最右面那一位與其他的不同,我們就可以得到想要的結果(我們可以把所有的數分成兩部分,最右面是0的,最右面是1的,如果兩部分都有數,那麼最後的結果就是將兩部分的數互相配對就可以,答案為1*去重之後的剩下的點數),但是,有可能所有的數都是偶數,那麼最右面那一位就都是0,我們就需要考慮右數第二位.
由此,如何尋找這些數中,最低的 存在不同數字 的那一位 就成了關鍵
我們這麼做
int v1 =
0,v0 =
0xffffffff
;//v1記錄哪一位存在1,v0記錄哪一位存在0
for(
int i =
1;i <= n;i++
)//n是去重後的點的數量
這樣得到的結果,v0中是0的位,說明剩下的數中,有這一位是0的數,v1中是1的位代表剩下的這些數中,有這一位是1的數
只需要將lowbit(v0^v1),就可以得到最低位1的位置.
這裡,lowbit也有乙個小技巧
int
lowbit
(int x)
這樣就可以得到乙個數最低位的1了,注意,得到的數是十進位制中這一位代表的數. 牛客寒假訓練營第二場D 整除分塊
牛客寒假訓練營第二場d題 題意就是 s rfloor 其中 i in 1,n 輸入t,n,x。t表示測試的個數,求每個測試 lfloor dfrac rfloor 在去重集合s中降序排序第幾大。2 測試的個數 25 9 1000000000 10000000008 63244當n 25時候,s lf...
牛客寒假演算法訓練營2 建通道
輸出一行,乙個整數表示答案。示例1 複製2 1 2複製 對於此題來說,拋去所有附加條件不管,是乙個mst問題。然鵝對於這種資料範圍,即使處理了重複的點再去建邊跑kruskal也是不科學的 將信將疑於是乎我們來思考別的解法。首先,毋庸置疑,肯定是去重,因為異或相同為0嘛,沒有花費當然要連咯。其次,對於...
2019牛客暑期多校訓練營(第二場)
題意 題解 c 版本一 include using namespace std typedef long long ll const int mod 1e9 7 ll power ll a,ll b a是底數,b是次冪 return ans ll phi ll n 求尤拉函式值 返回值為多少個與n互...