Logo wuziyue的博客

博客

2023年4月月赛2 题解 第一题

2023-04-16 14:48:25 By wuziyue

Q1(Markdown不太会用)

[题目](http://go.helloworldroom.com:50080/contest/78/problem/12859)

分析一下:for example: 4出现于那些步骤? 答:4,5,8,9,10,11,16,17,18,19,20,21,22,23,33......

分一下类:4.5 / 8 9 10 11 / 16,17,18,19,20,21,22,23,33

进一步发现:这些数字在(x1,y1) (x2,y2)这样的区间中(x2=x1乘(符号怎么打?)2,y2=y1乘2+1)

对于偶数n来说,x1=n,x2=n+1; 对于奇数n来说,x1=n乘2,x2=n乘2+1;(不要忘记n本身未算在内)

不要问我如何发现的

然后,将1至n分为奇数与偶数分别二分,比较奇偶数中大者输出

主要函数:

int se(int l){
    if(l==0) return m+10;
    int ans=0;
    if(l%2==1){
        ans++;
    }
    else l/=2;
    int a1=l,a2=l;
    while(1){
        a1*=2;
        a2*=2;
        a2++;
        if(a1>n){
            return ans;
        }
        if(a2>n){
            ans+=n-a1+1;
            return ans;
        }
        else ans+=a2-a1+1;
    }
}

二分部分:

    int l=1,r=(n+1)/2;
    while(l<r){
        int mid=(l+r)/2+1;
        int sum=se(mid*2-1);
        if(sum>=m){
            l=mid;
        }
        else r=mid-1;
    }//奇数
    l=l*2-1;
    int l2=0,r2=n/2;
    while(l2<r2){
        int mid=(l2+r2)/2+1;
        int sum=se(mid*2);
        if(sum>=m){
            l2=mid;
        }
        else r2=mid-1;
    }
    l2=l2*2;//偶数

评论

昊然
不会用看这个: https://vfleaking.blog.uoj.ac/blog/7

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。