
解題思路:就是求數 n 對應的二進制數中有多少個 1
解題思路:對(strength, i, j)按照strength進行遞減排序,從左到右進行周遊,用b[n]表示i和j有關系!
如果發現b[i]或者b[j]有關系了,則跳過這個strength, 否則b[i] =j, b[j] = i
解題思路:
我們可以發現這樣的一個規律:
(1)首先b一定要小于a,否則無論如何曲線也無法通過(a,b);
(2)設int k=a/b, 如果k為奇數,說明這個點在上圖的綠色的線上, 沒關系,我們讓 k+=1;這樣的話一定有(0,0), (a,b)這兩點确定的直線的
斜率1/k介于(1/(k-1), 1/(k+1))之間,那麼我們可以通過縮小(或者放大)x的值,使得第 k/2 個周期塊 斜率為-1的那條邊經過(a, b)。此時
的x值就是最小的!
(3)如果(a,b)在第 k/2 個周期塊 斜率為-1的那條邊上,那麼這條邊與x軸的交點就是(a+b, 0), 從(0, 0)到(a+b, 0)一共經過了 k/2個周期,
是以 x = (a+b)*1.0/(k/2 * 2)
(4)唉....想的這麼明白,容易嗎.....
解題思路:如果某個數a[i]乘以x, 必定會導緻a[i]的二進制的長度增大。
首先求出或運算的字首和字尾,然後對每個a[i]操作如下: a[i]*=x^k(x的k次方); 最後找到a[i]|pref[i-1]|suff[i+1]的最大值!
其實可以優化一處,就是a[i]|pref[i-1]|suff[i+1]的最大值一定對應二進制長度最大的a[i]; 可通過log(a[i])+1求得二進制長度!