Need help on this problemA dp problem(I think)
Difference between en8 and en9, changed 26 character(s)
The problem is basically monopoly but you don't need to roll dices or stuffs, we have $N$ $(1 \leq N \leq 10^5)$ positions each of which are all empty. We can play any number of rounds by each rounds we choose an index $i$, if it's empty, we'll build a house on that position which will cost us $A_i$, and gives us 1 points, but if it's a house already, we'll transform the house to a apartment, which will cost us $B_i$, and gives us 1 points, if it's already an apartment we'll do nothing, which gives us nothing and cost us nothing (so there's no reason to do this). **We always want to maximize the amount of points.** (We can make  an apartment on the position $i$ if and only if the position $i$ is a already a house)↵

There will be $Q$ $(1 \leq Q \leq 10^5)$ queries, on the $ith$ query $(1 \leq i \leq Q)$ we have a budget of $X_i$, which means that the total sums of cost cannot exceed $X_i$. We want to know that, for each queries $i$ $(1 \leq i \leq Q)$ what is the maximum amount of points we can possibly get?↵

Constraints:↵

- $1 \leq N,Q \leq 10^5$↵

- $1 \leq A_i,B_i \leq 10^{14}$↵

- $1 \leq X_i \leq 2 \cdot 10^{14}$↵

<spoiler summary="What I tried(Not the full solution)">↵
Time complexity: $O(N^2+QlogN)$↵

I made a knapsack $ks$ as an array of size of $2 \cdot N$ , which $ks_i$ represent the minimum cost to get $i$ amount of points.(takes time of $O(N^2)$ of precomputing), then I received the queries and binary searched the maximum amount of points we can get and outputted it.(takes time of $O(QlogN)$) aaaand I'm stuck here. I don't know how to optimize this further...↵

~~~~~↵
/********************↵
 * what  the  sigma *↵
 ********************/↵
#include <iostream>↵
#include <vector>↵
#include <map>↵
#include <queue>↵
#include <algorithm>↵
#include <ext/pb_ds/assoc_container.hpp>↵
#include <ext/pb_ds/tree_policy.hpp>↵
using namespace __gnu_pbds;↵
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>↵
using namespace std;↵
#define lgm cin.tie(0)->sync_with_stdio(0);↵
#define be(x) x.begin(),x.end()↵
#define ve vector↵
#define ll long long↵
#define ld long double↵
#define db(x) cout << "Debug at " << x << endl;↵
#define ull unsigned ll↵
#define f first↵
#define s second↵
#define pii pair<int, int>↵
#define tii tuple<int,int,int>↵
#define pll pair<ll,ll>↵
#define sz(x) (int)x.size()↵
#define pb push_back↵
const int mod = 1e9+7,maxn=200005;↵
ll ks[200001];↵
int main() {↵
    cin.tie(0)->sync_with_stdio(0);↵
    ll n,cnt=0,cnt2=0;↵
    cin >> n;↵
    ll a[n],b[n];↵
    vector<ll> v;↵
    for (ll i=0;i<n;i++) {↵
        cin >> a[i];↵
        v.push_back(a[i]);↵
    }↵
    for (ll i=0;i<n;i++) {↵
        cin >> b[i];↵
        v.push_back(b[i]);↵
        if (a[i] <= b[i]) {↵
            cnt++;↵
        } else if (a[i]>=b[i]) {↵
            cnt2++;↵
        }↵
    }↵
    ll q;↵
    cin >> q;↵
    ll m=100000;↵
    m=m*m*m;↵
    ll x;↵
    for (int i=1;i<=2*n;i++) {↵
        ks[i]=m;↵
    }↵
    for (int i=0;i<n;i++) {↵
        for (int j=2*(i+1);j>=2;j--) {↵
            ks[j]=min(ks[j],min(ks[j-1]+a[i],ks[j-2]+a[i]+b[i]));↵
        }↵
        ks[1]=min(a[i],ks[1]);↵
    }↵
    while (q--) {↵
        cin >> x;↵
        int l=upper_bound(ks,ks+2*n+1,x)-ks-1;↵
        cout << l<<'\n';↵
    }↵
}↵
~~~~~↵


</spoiler>↵

I could not find a solution. But if anyone can, please comment what the solution to this problem could be(Other people would know too!), I would really appreciate it!↵

Thanks in advance!

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en10 English SkyMagic 2024-11-25 10:42:25 3 Tiny change: ' \leq 10^{14}$\n\n- $1' -> ' \leq 10^{9}$\n\n- $1'
en9 English SkyMagic 2024-11-24 16:06:16 26
en8 English SkyMagic 2024-11-24 14:23:26 1705 (published)
en7 English SkyMagic 2024-11-24 14:21:59 295
en6 English SkyMagic 2024-11-24 14:16:26 389
en5 English SkyMagic 2024-11-24 14:10:01 6
en4 English SkyMagic 2024-11-24 14:09:51 259
en3 English SkyMagic 2024-11-24 14:07:06 2 Tiny change: 'e $Q$ $(1 leq Q leq 10^5)$' -> 'e $Q$ $(1 \leq Q \leq 10^5)$'
en2 English SkyMagic 2024-11-24 14:05:50 464
en1 English SkyMagic 2024-11-24 13:57:26 451 Initial revision (saved to drafts)