F怎么炸了qwq

#include<bits/stdc++.h>
using namespace std;
void read(long long &x)
{
    x=0;long long f=0;char ch=getchar();
    while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return;
}
const long long maxn = 100005;
long long ll[maxn],rr[maxn],k,t,l,r,a[maxn];
long long minn,maxx;
bool qieke(__int128 x){
    if(x == 0) return 1;
    for(int i=1;i<=k;++i){
        if(x * ll[i] > a[i]) return 0;
    }
    //一定行了看来是
    long long nw = 0,duo = 0;
    for(int i=1;i<=k;++i){
        if(x * rr[i] >= a[i]){
            nw += a[i]/x;
            duo += a[i]%x;
        }
        else{
            nw += rr[i];
        }
    }
    nw += duo/x,duo %= x;
    return nw >= l;
}
int main()
{
    read(k),read(l),read(r);
    minn = 0,maxx = 1e10;
    for(int i=1;i<=k;++i) read(a[i]);
    for(int i=1;i<=k;++i)
        read(ll[i]),read(rr[i]);
    int ans1 = 0,ans2 = 0;
    for(int i=1;i<=k;++i){
        ans1 += ll[i];
        ans2 += min(rr[i],a[i]);
    }
    for(int i=1;i<=k;++i){
        if(a[i] < ll[i]){
            printf("0");
            return 0;
        }
    }
    if(ans1 > r || ans2 < l){
        printf("0");
        return 0;
    }
    long long zuo = 0,you = 1e18;
    while(zuo < you){
        long long mid = (zuo + you)/2+1;
        if(qieke(mid)) zuo = mid ;
        else you = mid - 1;
    }
    you = max(you,1ll*0);
    printf("%lld",you);
}
//二分答案。
//考虑每一个东西的集合的区间。
//然后呢?取一个交集。然后呢?
//然后每一次大概就选多少个来补充一下。
//然后再二分答案。
//不对,应该是尽可能平均分配一下。
//求出合法区间之后平均分配一下。
//回来之后直接平均分配

/*
4 10 10
4 20 10 6
1 2
3 5
2 4
0 2
*/
全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务