#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <stdint.h>
#include <vector>
struct CacheKey {
CacheKey(int start, int size, int teams_nr) : start(start), size(size), teams_nr(teams_nr) {}
int start;
int size;
int teams_nr;
friend bool operator<(const CacheKey &l, const CacheKey &r) {
return std::tie(l.start, l.size, l.teams_nr) < std::tie(r.start, r.size, r.teams_nr);
}
};
std::map<CacheKey, int64_t> g_cache;
std::vector<int64_t> count_teams(const std::vector<int64_t> &soldiers,
const int K) {
std::vector<int64_t> teams(soldiers.size() - K + 1);
teams[0] = std::accumulate(soldiers.begin(), soldiers.begin() + K, 0);
for (int i = 1; i < ((int)soldiers.size()) - K + 1; ++i) {
teams[i] = teams[i - 1] - soldiers[i - 1] + soldiers[i + K - 1];
}
// DEBUG
// for (auto i : teams) {
// fprintf(stderr, "%ld\n", i);
// }
return teams;
}
int64_t count_max(const std::vector<int64_t> &soldiers,
const std::vector<int64_t> &teams, const int K, int start,
int size, int teams_nr) {
// DEBUG
// fprintf(stderr, "start: %d size: %d teams_nr: %d\n", start, size,
// teams_nr);
if (teams_nr == 0 || size < K) {
return 0;
}
CacheKey key(start, size, teams_nr);
{
auto iter = g_cache.find(key);
if (iter != g_cache.end()) {
return iter->second;
}
}
int64_t max = 0;
const int end = start + size - K + 1;
for (int i = start; i < end; ++i) {
// DEBUG
// fprintf(stderr, "i: %d, size: %d max: %ld\n", i, end, max);
max = std::max(max,
teams[i] + count_max(soldiers, teams, K, i + K,
size - (i + K - start), teams_nr - 1));
}
// DEBUG
// fprintf(stderr, "max: %ld\n", max);
g_cache.insert(std::make_pair(key, max));
return max;
}
int main() {
int N = 0;
int K = 0;
int Q = 0;
std::cin >> N;
std::cin >> K;
std::cin >> Q;
std::vector<int64_t> soldiers(N);
for (int i = 0; i < N; ++i) {
std::cin >> soldiers[i];
}
///////////////////////////
const std::vector<int64_t> teams = count_teams(soldiers, K);
for (int i = 0; i < Q; ++i) {
int L = 0;
int R = 0;
std::cin >> L;
std::cin >> R;
std::cout << count_max(soldiers, teams, K, L - 1, R - L + 1,
(R - L + 1) / K)
<< std::endl;
// DEBUG
// 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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include <map> #include <numeric> #include <set> #include <stdint.h> #include <vector> struct CacheKey { CacheKey(int start, int size, int teams_nr) : start(start), size(size), teams_nr(teams_nr) {} int start; int size; int teams_nr; friend bool operator<(const CacheKey &l, const CacheKey &r) { return std::tie(l.start, l.size, l.teams_nr) < std::tie(r.start, r.size, r.teams_nr); } }; std::map<CacheKey, int64_t> g_cache; std::vector<int64_t> count_teams(const std::vector<int64_t> &soldiers, const int K) { std::vector<int64_t> teams(soldiers.size() - K + 1); teams[0] = std::accumulate(soldiers.begin(), soldiers.begin() + K, 0); for (int i = 1; i < ((int)soldiers.size()) - K + 1; ++i) { teams[i] = teams[i - 1] - soldiers[i - 1] + soldiers[i + K - 1]; } // DEBUG // for (auto i : teams) { // fprintf(stderr, "%ld\n", i); // } return teams; } int64_t count_max(const std::vector<int64_t> &soldiers, const std::vector<int64_t> &teams, const int K, int start, int size, int teams_nr) { // DEBUG // fprintf(stderr, "start: %d size: %d teams_nr: %d\n", start, size, // teams_nr); if (teams_nr == 0 || size < K) { return 0; } CacheKey key(start, size, teams_nr); { auto iter = g_cache.find(key); if (iter != g_cache.end()) { return iter->second; } } int64_t max = 0; const int end = start + size - K + 1; for (int i = start; i < end; ++i) { // DEBUG // fprintf(stderr, "i: %d, size: %d max: %ld\n", i, end, max); max = std::max(max, teams[i] + count_max(soldiers, teams, K, i + K, size - (i + K - start), teams_nr - 1)); } // DEBUG // fprintf(stderr, "max: %ld\n", max); g_cache.insert(std::make_pair(key, max)); return max; } int main() { int N = 0; int K = 0; int Q = 0; std::cin >> N; std::cin >> K; std::cin >> Q; std::vector<int64_t> soldiers(N); for (int i = 0; i < N; ++i) { std::cin >> soldiers[i]; } /////////////////////////// const std::vector<int64_t> teams = count_teams(soldiers, K); for (int i = 0; i < Q; ++i) { int L = 0; int R = 0; std::cin >> L; std::cin >> R; std::cout << count_max(soldiers, teams, K, L - 1, R - L + 1, (R - L + 1) / K) << std::endl; // DEBUG // break; } return 0; } |
English