#include "peru.h"
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
#include <cmath>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <numeric>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <bitset>
#include <cstring>
#include <unordered_map>
using namespace std;
typedef int ll;
ll const mod = (ll)(1e9 + 7);
struct one{
ll res, min_dp, mx, mod;
};
one t[4 * 2500000 + 7];
void build(ll v, ll l, ll r){
if(l == r){
t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
t[v].mod = -1;
return;
}
ll mid = (l + r) >> 1;
build(2 * v, l, mid);
build(2 * v + 1, mid + 1, r);
t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
t[v].mod = -1;
}
void push(ll v, ll l, ll r){
if(l != r && t[v].mod != -1){
//cout << " pushing " << l << ' ' << r << ' ' << t[v].mod << endl;
t[2 * v].mod = max(t[2 * v].mod, t[v].mod);
t[2 * v].res = t[2 * v].min_dp + t[2 * v].mod;
//cout << " left son val :::::::: " << l << ' ' << r << ' ' << t[2 * v].res << endl;
t[2 * v + 1].mod = max(t[2 * v + 1].mod, t[v].mod);
t[2 * v + 1].res = t[2 * v + 1].min_dp + t[2 * v + 1].mod;
t[v].mod = -1;
}
}
void update_dp(ll v, ll l, ll r, ll pos, ll val, ll mx){
if(l == r){
t[v].min_dp = val;
t[v].res = val + mx;
t[v].mod = mx;
//cout << " update_dp " << l << ' ' << r << ' ' << t[v].res << ' ' << t[v].min_dp << endl;
return;
}
ll mid = (l + r) >> 1;
push(v, l, r);
if(pos <= mid)
update_dp(2 * v, l, mid, pos, val, mx);
else
update_dp(2 * v + 1, mid + 1, r, pos, val, mx);
t[v].res = min(t[2 * v].res, t[2 * v + 1].res);
//cout << l << ' ' << mid << ' ' << t[2 * v].res << endl;
//cout << " update_dp " << l << ' ' << r << ' ' << t[v].res << ' ' << pos << ' ' << val << ' ' << mx << endl;
t[v].min_dp = min(t[2 * v].min_dp, t[2 * v + 1].min_dp);
}
void update_mx(ll v, ll l, ll r, ll ql, ll qr, ll mx){
if(r < ql || qr < l)
return;
if(ql <= l && r <= qr){
t[v].mod = max(t[v].mod, mx);
t[v].res = t[v].min_dp + t[v].mod;
// cout << l << ' ' << r << ' ' << t[v].mod << endl;
return;
}
ll mid = (l + r) >> 1;
push(v, l, r);
update_mx(2 * v, l, mid, ql, qr, mx);
update_mx(2 * v + 1, mid + 1, r, ql, qr, mx);
t[v].res = min(t[2 * v].res, t[2 * v + 1].res);
t[v].min_dp = min(t[2 * v].min_dp, t[2 * v + 1].min_dp);
}
ll get_min(ll v, ll l, ll r, ll ql, ll qr){
if(r < ql || qr < l)
return (ll)(2500000) * (ll)(2000000000) + 1;
if(ql <= l && r <= qr){
// cout << "geting getting getting getiing getting " << l << ' ' << r << ' ' << t[v].res << endl;
return t[v].res;
}
ll mid = (l + r) >> 1;
push(v, l, r);
return min(get_min(2 * v, l, mid, ql, qr), get_min(2 * v + 1, mid + 1, r, ql, qr));
}
int solve(int n, int k, int* b){
vector<ll>dp(n + 1), a(n + 1);
for(int i = 0; i < n; i++)
a[i + 1] = b[i];
build(1, 1, n);
dp[1] = a[1];
update_dp(1, 1, n, 1, 0, a[1]);
for(int i = 2; i <= n; i++){
dp[i] = (dp[i - 1] + (ll)a[i]);
update_dp(1, 1, n, i, dp[i - 1], a[i]);
ll mx = 0;
ll last = 1;
for(int j = i - 1; j >= max(0, i - k + 1); j--){
mx = max(mx, (ll)a[j]);
if(mx > a[i]){
last = j + 1;
break;
}
}
// cout << "LAST " << last << endl;
if(last <= i - 1)
update_mx(1, 1, n, last, i - 1, a[i]);
// cout << get_min(1, 1, n, i - k + 1, i) << endl;
dp[i] = get_min(1, 1, n, i - k + 1, i);
}
ll p = 1;
ll ans = 0;
for(int i = n; i >= 1; i--){
dp[i] %= mod;
ans = (ans + (p * dp[i]) % mod) % mod;
p = (p * 23) % mod;
}
return ans;
}
Compilation message
peru.cpp: In function 'void build(ll, ll, ll)':
peru.cpp:33:58: warning: integer overflow in expression of type 'll' {aka 'int'} results in '937459712' [-Woverflow]
33 | t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
| ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
peru.cpp:42:54: warning: integer overflow in expression of type 'll' {aka 'int'} results in '937459712' [-Woverflow]
42 | t[v].res = t[v].min_dp = t[v].mx = (ll)(2500000) * (ll)(2000000000) + 1;
| ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
peru.cpp: In function 'll get_min(ll, ll, ll, ll, ll)':
peru.cpp:110:30: warning: integer overflow in expression of type 'll' {aka 'int'} results in '937459712' [-Woverflow]
110 | return (ll)(2500000) * (ll)(2000000000) + 1;
| ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
340 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |