Codeforces Round #608 (Div. 2)E

E题:http://codeforces.com/contest/1271/problem/E

分析:分别考虑偶数和奇数,对于每一个x,反推回去的话,可得[2*x,2*x+1]之间的数都是可到到达的,且x越小能到达的值越多,所以满足单调性,二分解决

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
bool check(ll x){
    ll l=x,r=x;
    if(x%2==0)
        r++;
    ll ans=0;
    while(true){
        ans+=min(n,r)-l+1;
        l<<=1;
        r<<=1;
        r++;
        if(l>n)
            break;
    }
    return ans>=k;
}
int main(){
    cin>>n>>k;
    ll l=1,r=(n+1)/2;
    ll ans=0;
    while(l<=r){///二分枚举合法奇数
        ll midd=(l+r)>>1;
        if(check(2*midd-1))
            l=midd+1,ans=2*midd-1;
        else
            r=midd-1;
    }
    l=1,r=n/2;
    while(l<=r){///偶数
        ll midd=(l+r)>>1;
        if(check(2*midd))
            l=midd+1,ans=max(2*midd,ans);
        else
            r=midd-1;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/starve/p/12060134.html