题解 CF1271E Common Number
找规律。
我们看有哪些数的 \(path\) 经过 \(x\)。
当 \(x\) 为奇数时,有:\(x,2x,2x+1,4x,4x+1,4x+2,4x+3...\)
当 \(x\) 为偶数时,有:\(x,x+1,2x,2x+1,2x+2,2x+3,4x,4x+1...\)
规律很明显,不解释。
因为当 \(x\) 为奇数和 \(x\) 为偶数时都分别具有单调性,所以可以做两次二分,再在 \(O(\log n)\) 的复杂度内算出有多少个数的 \(path\) 进过它即可。
总复杂度 \(O(\log^2 n)\)。
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
ll get(ll x){
ll cnt=0;
for(ll i=x,mi=(x%2?1:2);i<=n;i*=2,mi*=2)cnt+=min(mi,n-i+1);
return cnt;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>k;
ll l=1,r=n/2,ans=0,ans2=0;
while(l<=r){
ll mid=(l+r)/2;
if(get(mid*2)>=k)ans=mid*2,l=mid+1;
else r=mid-1;
}
l=0,r=(n-1)/2;
while(l<=r){
ll mid=(l+r)/2;
if(get(mid*2+1)>=k)ans2=mid*2+1,l=mid+1;
else r=mid-1;
}
cout<<max(ans,ans2)<<endl;
return 0;
}

浙公网安备 33010602011771号