#include "peru.h"
#include <bits/stdc++.h>
using namespace std;
#define sz(x) (int)x.size()
#define all(x) x.begin() , x.end()
const long long inf = 1e18 + 7;
const long long mod = 1e9 + 7;
long long fastpow(long long a , long long b){
long long ret = 1;
while(b){
if(b&1)ret = ret * a % mod;
a = a * a % mod;
b >>= 1;
}
return ret;
}
struct SEGTmax{
vector < long long > t;
long long tree_size;
const long long identity_element = -inf;
long long merge(long long x , long long y){
return max(x,y);
}
void init(long long x){
tree_size = x+3;
t.assign(2*tree_size , identity_element);
}
void modify(long long p, long long value) { // set value at position p
for (t[p += tree_size] = value; p > 1; p >>= 1){
t[p>>1] = merge(t[p] , t[p^1]);
}
}
long long query(long long l, long long r) { // sum on long longerval [l, r]
long long res = identity_element;
for (r+=1 , l += tree_size, r += tree_size; l < r; l >>= 1, r >>= 1) {
if (l&1) res = merge(res , t[l++]);
if (r&1) res = merge(res , t[--r]);
}
return res;
}
};
struct SEGTmin{
vector < long long > t;
long long tree_size;
const long long identity_element = inf;
long long merge(long long x , long long y){
return min(x,y);
}
void init(long long x){
tree_size = x+3;
t.assign(2*tree_size , identity_element);
}
void modify(long long p, long long value) { // set value at position p
for (t[p += tree_size] = value; p > 1; p >>= 1){
t[p>>1] = merge(t[p] , t[p^1]);
}
}
long long query(long long l, long long r) { // sum on long longerval [l, r]
long long res = identity_element;
for (r+=1 , l += tree_size, r += tree_size; l < r; l >>= 1, r >>= 1) {
if (l&1) res = merge(res , t[l++]);
if (r&1) res = merge(res , t[--r]);
}
return res;
}
};
int solve(int n, int k, int* v){
SEGTmax arr;
arr.init(n);
SEGTmin dp;
dp.init(n);
for(int i = 0;i<n;i++){
arr.modify(i , v[i]);
}
long long ans = 0;
dp.modify(0 , 0);
for(int i = 0;i<n;i++){
long long val = arr.query(max(0,i-k+1) , i) + dp.query(max(0,i+1-k) , i);
// cout << "bruh : " << dp.query(max(0ll,i+1-k),i) << endl;
// cout << i+1 << " : " << val << endl;
dp.modify(i+1 , val);
ans = 1LL * (ans + 1LL * val * fastpow(23,n-i-1) % mod) % mod;
}
return ans;
}
// signed main(){
// int n,k;
// cin >> n >> k;
// int arr[n];
// for(int i = 0;i<n;i++)cin >> arr[i];
// cout << solve(n,k,arr) << 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... |