#include #define ls rt<<1 #define rs rt<<1|1 using namespace std; typedef long long ll; const ll inf = 0x3f3f3f3f3f3f3f3f; const int maxn = 1000001; int n; struct node { int id; ll t; friend bool operator<(node s1, node s2) { return s1.t < s2.t; } } q[2010]; ll a[2010]; ll tr[2010<<2], lz[2010<<2]; void build(int rt, int l, int r) { lz[rt] = 0; if(l == r) { tr[rt] = a[l]; return ; } int mid = (l + r) >> 1; build(ls, l, mid); build(rs, mid + 1, r); tr[rt] = min(tr[ls], tr[rs]); } ll query(int rt, int l, int r, int L, int R) { if(L <= l && R >= r) return tr[rt]; if(lz[rt]) { tr[ls] -= lz[rt], tr[rs] -= lz[rt]; lz[ls] += lz[rt], lz[rs] += lz[rt]; lz[rt] = 0; } int mid = (l + r) >> 1; ll ans = inf; if(L <= mid) ans = min(ans, query(ls, l, mid, L, R)); if(R > mid) ans = min(ans, query(rs, mid + 1, r, L, R)); return ans; } void add(int rt, int l, int r, int L, int R, ll u) { if(L <= l && R >= r) { tr[rt] -= u; lz[rt] += u; return ; } if(lz[rt]) { tr[ls] -= lz[rt], tr[rs] -= lz[rt]; lz[ls] += lz[rt], lz[rs] += lz[rt]; lz[rt] = 0; } int mid = (l + r) >> 1; if(L <= mid) add(ls, l, mid, L, R, u); if(R > mid) add(rs, mid + 1, r, L, R, u); tr[rt] = min(tr[ls], tr[rs]); } int main() { int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%lld", &q[i].t), q[i].id = i; for(int i = 1; i <= n; i++) scanf("%lld", &a[i]), a[i] += a[i - 1]; build(1, 1, n); sort(q + 1, q + 1 + n); int ans = 0; for(int i = 1; i <= n; i++) { ll cost = query(1, 1, n, q[i].id, n); if(cost >= q[i].t) { ans++; add(1, 1, n, q[i].id, n, q[i].t); } } printf("%d\n", ans); } }