#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vi vector<long long>
#define all(x) x.begin(), x.end()
#define endl "\n"
#define pr pair<ll, ll>
#define ff first
#define ss second
void solution();
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
solution();
return 0;
}
const long long inf = 1e9;
const int N = 1e6+10;
ll a[N]{inf}, v[N];
ll n, s, k;
pr pos(int i) {
pr ans;
ll p = 0, q = i;
while (p <= q) {
ll mid = (p + q)/2;
if (a[i]-a[mid] <= k) q = mid-1;
else {
ans.ff = mid;
p = mid+1;
}
}
p = i, q = n+1;
while (p <= q) {
ll mid = (p + q)/2;
if (a[mid]-a[i] <= k) p = mid+1;
else {
ans.ss = mid;
q = mid-1;
}
}
return ans;
}
ll cost(pr m) {
m.ss--;
return v[m.ss]-v[m.ff];
}
pr max(pr p1, pr p2) {
if (p1.ff > p2.ff) return p1;
return p2;
}
void solution() {
cin >> n >> s >> k;
for (int i = 2; i <= n; i++) {cin >> a[i]; a[i] += a[i-1];}
for (int i = 1; i <= n; i++) cin >> v[i];
for (int i = 1; i <= n; i++) v[i] += v[i-1];
a[n+1] = inf;
vector<vi> dp(n+10, vi(s+10));
vector<vector<pr>> best(n+10, vector<pr>(s+10));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= s; j++) {
pr m = pos(i);
ll c = cost(m) + best[m.ff][j-1].ff;
dp[i][j] = c;
best[m.ss-1][j] = max(best[m.ss-1][j], {dp[i][j], i});
}
}
ll ans = 0, mx = 0;
for (int i = 1; i <= n; i++) {
if (mx < dp[i][s]) {
ans = i;
mx = dp[i][s];
}
}
cout << 1 << endl;
cout << ans << endl;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |