題解:
首先我們要知道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 考慮正難則反,最終 連通塊數 點數 邊數 環數 點數和邊數可以算,於是我們希望最大化最終剩下的期望環數。這時候可以感覺到欽定每個環長度為 ...