题解 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;
}

posted @ 2023-07-17 21:51  HQJ2007  阅读(21)  评论(0)    收藏  举报