#include <stdio.h>
#include <vector>
#include <map>
#include <assert.h>
int k;
int max(int a, int b){
return a > b ? a : b;
}
void caclucateAggr(std::vector<int> & sol, std::vector<int> & aggr, int k){
int first = 0;
for(int i = 0; i < k; ++i) first += sol[i];
aggr.push_back(first);
for(int i = k; i < (int)sol.size(); ++i){
first = first + sol[i] - sol[i-k];
aggr.push_back(first);
}
}
typedef std::pair<int,int> IntPair;
std::map<IntPair, int> cache;
int calculateMax(std::vector<int> & aggr, int begin, int end){
if (begin > end - k + 1)
return 0;
// assert(begin < aggr.size());
IntPair key(begin,end);
if (!cache.empty() && cache.find(IntPair(begin,end)) != cache.end()){
// printf("CACHE (%d %d) %d\n", key.first, key.second, cache[key]);
return cache[key];
}
// int res = 0;
// for(int i = begin; i <= end - k + 1; ++i){
int res = max(aggr[begin] + calculateMax(aggr, begin + k, end), calculateMax(aggr, begin + 1, end));
// }
cache[key] = res;
// printf("(%d %d) %d\n", key.first, key.second, res);
return res;
}
int main(){
int n,q;
scanf("%d %d %d",&n,&k,&q);
std::vector<int> sol(n);
std::vector<int> aggr;
for(int i = 0; i < n; ++i){
scanf("%d", &sol[i]);
}
caclucateAggr(sol,aggr,k);
// for(int i = 0; i < (int)aggr.size(); ++i) printf("%d ",aggr[i]);
// printf("\n");
// calculateMax(aggr, 0, n - 1);
for(int i = 0; i < q; ++i){
int b,e;
scanf("%d %d", &b,&e);
--b;
--e;
int m = calculateMax(aggr, b, e);
// if (e + k * 2 >= n - 1 || e - b <= k || b <= k){
// m = calculateMax(aggr, b, e);
//// printf("LICZYMY OD NOWA\n");
// } else {
// int pocz = calculateMax(aggr, b, n - 1);
// int kon = calculateMax(aggr, e, n - 1);
//// printf("(%d %d) %d %d\n", b, e, pocz, kon);
// m = pocz - kon;
// }
// cache.clear();
printf("%d\n",m);
// printf("=============== %d\n",m);
// break;
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <stdio.h> #include <vector> #include <map> #include <assert.h> int k; int max(int a, int b){ return a > b ? a : b; } void caclucateAggr(std::vector<int> & sol, std::vector<int> & aggr, int k){ int first = 0; for(int i = 0; i < k; ++i) first += sol[i]; aggr.push_back(first); for(int i = k; i < (int)sol.size(); ++i){ first = first + sol[i] - sol[i-k]; aggr.push_back(first); } } typedef std::pair<int,int> IntPair; std::map<IntPair, int> cache; int calculateMax(std::vector<int> & aggr, int begin, int end){ if (begin > end - k + 1) return 0; // assert(begin < aggr.size()); IntPair key(begin,end); if (!cache.empty() && cache.find(IntPair(begin,end)) != cache.end()){ // printf("CACHE (%d %d) %d\n", key.first, key.second, cache[key]); return cache[key]; } // int res = 0; // for(int i = begin; i <= end - k + 1; ++i){ int res = max(aggr[begin] + calculateMax(aggr, begin + k, end), calculateMax(aggr, begin + 1, end)); // } cache[key] = res; // printf("(%d %d) %d\n", key.first, key.second, res); return res; } int main(){ int n,q; scanf("%d %d %d",&n,&k,&q); std::vector<int> sol(n); std::vector<int> aggr; for(int i = 0; i < n; ++i){ scanf("%d", &sol[i]); } caclucateAggr(sol,aggr,k); // for(int i = 0; i < (int)aggr.size(); ++i) printf("%d ",aggr[i]); // printf("\n"); // calculateMax(aggr, 0, n - 1); for(int i = 0; i < q; ++i){ int b,e; scanf("%d %d", &b,&e); --b; --e; int m = calculateMax(aggr, b, e); // if (e + k * 2 >= n - 1 || e - b <= k || b <= k){ // m = calculateMax(aggr, b, e); //// printf("LICZYMY OD NOWA\n"); // } else { // int pocz = calculateMax(aggr, b, n - 1); // int kon = calculateMax(aggr, e, n - 1); //// printf("(%d %d) %d %d\n", b, e, pocz, kon); // m = pocz - kon; // } // cache.clear(); printf("%d\n",m); // printf("=============== %d\n",m); // break; } return 0; } |
English