https://codeforces.com/problemset/problem/1373/F
傻逼题没做出来系列,太菜了。。。
如果a[1]在b[1]上放得太多,就可能导致后面某个地方放不下。如果太少,则可能出现中间某个b[1]特别长,导致最后a[n]在b[n]上放的是固定数量的情况,如果没有这种情况那么a[1]在b[1]上放的就是跟a[n]在b[n]相关的,那就无所谓了。
那么我们只要通过二分找到恰好不会放不下的a[1]在b[1]上放的数量就行了。
好像不用二分直接分段看联通就行了。。。不过那个细节好像比较多。。。二分接单粗暴
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxl=1e6+10; int n,m,cas,k,cnt,tot,ans; int a[maxl],b[maxl]; char s[maxl]; bool in[maxl]; inline void prework() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); } inline int jug(int d) { int res=b[1]-d,l,r; for(int i=2;i<=n;i++) { if(res>=a[i]) l=a[i]; else l=res; r=a[i]-l; res=b[i]-r; if(res<0) return -1; } return r; } inline void mainwork() { int l=0,r=min(a[1],b[1]),mid; while(l+1<r) { mid=(l+r)>>1; if(jug(mid)<0) r=mid; else l=mid; } ans=0; if(jug(l)>=0 && jug(l)+a[1]-l<=b[n]) ans=1; if(jug(l+1)>=0 && jug(l+1)+a[1]-(l+1)<=b[n]) ans=1; } inline void print() { if(ans) puts("YES"); else puts("NO"); } int main() { int t=1; scanf("%d",&t); for(cas=1;cas<=t;cas++) { prework(); mainwork(); print(); } return 0; }