Submission #1296958

#TimeUsernameProblemLanguageResultExecution timeMemory
1296958NotLinuxPeru (RMI20_peru)C++20
0 / 100
569 ms49456 KiB
#include "peru.h" #include <bits/stdc++.h> using namespace std; #define sz(x) (int)x.size() #define all(x) x.begin() , x.end() const int inf = 1e18 + 7; const int 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 < int > t; int tree_size; const int identity_element = -inf; int merge(int x , int y){ return max(x,y); } void init(int x){ tree_size = x+3; t.assign(2*tree_size , identity_element); } void modify(int p, int 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]); } } int query(int l, int r) { // sum on interval [l, r] int 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 < int > t; int tree_size; const int identity_element = inf; int merge(int x , int y){ return min(x,y); } void init(int x){ tree_size = x+3; t.assign(2*tree_size , identity_element); } void modify(int p, int 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]); } } int query(int l, int r) { // sum on interval [l, r] int 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++){ int 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; // }

Compilation message (stderr)

peru.cpp:6:22: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
    6 | const int inf = 1e18 + 7;
      |                 ~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...