关闭

UOJ 133 [UR #9]电路手动分析

标签: UOJ-133
93人阅读 评论(0) 收藏 举报
分类:

二分。

刚开始做这题的时候,只是脑补出了这种做法,直觉告诉我它应该是对的,但并不会证明。
抱着试试看的心态打了一发,居然A了……

题解:http://vfleaking.blog.uoj.ac/blog/694

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    long long n, m, r, left, right;
    scanf("%lld%lld%lld",&n,&m,&r);
    left=1, right=n*m;
    if(!r)
    {
        return !printf("%lld\n",min(n*m,2ll));
    }
    else if(n==1||m==1)
    {
        while(left<right)
        {
            long long mid=(left+right+1)>>1;
            if((mid-1)*(mid-2)/2<=r)left=mid;
            else right=mid-1;
        }
    } 
    else
    {
        while(left<right)
        {
            long long mid=(left+right+1)>>1, pre, s, h;
            s=sqrt(mid);
            h=mid-s*s;
            if((s+1*(h!=0))<=n && (s+1*(h!=0))<=m)
            {
                pre=2*(s-1)*(s-1)+2*s-2;
                if(h)pre+=(h-1)*2+1;
                if(h>s)pre+=(h-s-1)*2+1;
            }
            else
            {
                s=min(n,m);
                h=mid/s;
                pre=2*(s-1)*(h-1)+s+h-2;
                h=mid%s;
                if(h)pre+=(h-1)*2+1;
            }
            if(1.0*mid*(mid-1)/2<=r+pre)left=mid;
            else right=mid-1;
        }
    }
    printf("%lld\n",left);
    return 0;
} 
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:41758次
    • 积分:3362
    • 等级:
    • 排名:第10352名
    • 原创:307篇
    • 转载:0篇
    • 译文:0篇
    • 评论:22条
    公告
    欢迎您 !
    由于博主是一个蒟蒻,
    如有错误之处还望指出!
    o( =•ω•= )o
    鸡汤
    ❤不要轻易否定自己,不要轻易放弃。
    ❤上天撒下一缕光明,我便不应安逸于黑暗之中。
    ❤不到万不得已,为什么要放弃。
    神犇们的博客
    文章分类