#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 */
全部评论
(0) 回帖