牛客挑戰賽45 C 友人 題解

2021-10-10 13:15:51 字數 829 閱讀 1211

題解:

首先我們要知道z^k=z+k-2*(z&k);

則只進行一次操作的代價:(r-l+1)*((z^k)+k-z)=2*(r-l+1)(k-z&k).

對於k-z&k,我們要令其盡可能的小,則z要是k的較大的子集。那麼我們列舉k的子集並儲存下來,對其排序。

然後我們列舉i=0->n,直到等差數列前i個數之和大於y

對於每乙個i,我們計算其前i個數之和s[i],為了滿足整個數列之和小於y,對於剩下的每乙個數,要滿足小於等於(y-s[i])/(n-i),即[0,(y-s[i])/(n-i)]

那麼我們要在這個區間尋找最大的k的子集,即可對之前存下的k子集的陣列進行二分查詢,然後計算此時的答案。

具體見**:

#include using namespace std;

const int maxn=1e6+10;

typedef long long ll;

ll n,a,d,k,y;

ll s[maxn];

ll si[maxn];

int cnt;

signed main() while(sub!=k);

sort(si+1,si+cnt+1);

//i=0的情況

ll minx=(y-s[0])/(n-0);

int p=upper_bound(si+1,si+1+cnt,minx)-si-1;

ans=ans=min(ans,1ll*2*(n-0)*(k-si[p]));

//1-n的情況

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

cout<}

牛客Wannafly挑戰賽12 題解

傳送門 說是比賽題解,其實我只會前三題 後面的一定補 t1題意,在乙個長度為n的時間內,問如何選擇存款期限,使得收益最大。dp include include include include using namespace std define fi first define se second d...

牛客挑戰賽58

前i 1的二進位制相等,a的前n個數的前i 1位可以亂取,b的前n 1個數前i 1位也可以亂取,因為b的第n個數的前i 1異或可為任意值,所以sum1 2 i 1 n 2 i 1 n 1 2 i 1 2n 1 a的第i位為1且b的第i位為0 只要a的n數第i位中有乙個不為0的,a的第i位不為0,b的...

牛客挑戰賽45 E 旁觀者

構造乙個 n 個點,m 條邊的仙人掌,使得隨機刪 k 個點之後期望的連通塊個數盡量大。輸出這個最大的期望的連通塊數。n,m,k le 10 9 神仙題。我的1h 考慮正難則反,最終 連通塊數 點數 邊數 環數 點數和邊數可以算,於是我們希望最大化最終剩下的期望環數。這時候可以感覺到欽定每個環長度為 ...