/*
* =====================================================================================
*
* Filename: buc.cpp
*
* Description: https://sio2.mimuw.edu.pl/c/pa-2024-1/p/buc/
*
* Version: 0.1.0
* Created: 15.03.2024
*
* Author: Michał Zagórski (zagura), <zagura6@gmail.com>
*
* =====================================================================================
*/
#include <cstdio>
#include <vector>
#include <list>
#include <unordered_map>
using std::vector;
using std::list;
using std::unordered_map;
int main() {
int len = 0;
scanf("%d", &len);
vector<int> nums {};
nums.reserve(len);
for (int i = 0; i < len; i++) {
int c;
scanf("%d", &c);
nums.push_back(c);
}
vector<long long int> sums;
unordered_map<long long int, list<size_t>> ids {};
long long int current_sum = 0;
for (int i = 0; i < len; i++) {
current_sum = 0;
for (int j = i; j < len; j++) {
current_sum += nums[j];
sums.push_back(current_sum);
ids[current_sum].push_back(sums.size() - 1);
}
}
//for (const auto& el: sums) {
// printf("%lld ", el);
//}
//printf("\n");
unsigned long long int totals = 0;
for (int i = 0; i < sums.size() - 2; i++) {
long long int sum = 0;
for (int j = i + 1; j < sums.size() - 1; j++) {
sum = sums[i] + sums[j];
auto it = ids.find((-1) * sum);
if (it != ids.end()) {
list<size_t>& l = it->second;
auto current = l.begin();
for (size_t k = 0; k < l.size(); k++) {
if (*current > j) {
totals += (l.size() - k);
break;
}
++current;
}
}
}
}
printf("%llu\n", totals);
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 | /* * ===================================================================================== * * Filename: buc.cpp * * Description: https://sio2.mimuw.edu.pl/c/pa-2024-1/p/buc/ * * Version: 0.1.0 * Created: 15.03.2024 * * Author: Michał Zagórski (zagura), <zagura6@gmail.com> * * ===================================================================================== */ #include <cstdio> #include <vector> #include <list> #include <unordered_map> using std::vector; using std::list; using std::unordered_map; int main() { int len = 0; scanf("%d", &len); vector<int> nums {}; nums.reserve(len); for (int i = 0; i < len; i++) { int c; scanf("%d", &c); nums.push_back(c); } vector<long long int> sums; unordered_map<long long int, list<size_t>> ids {}; long long int current_sum = 0; for (int i = 0; i < len; i++) { current_sum = 0; for (int j = i; j < len; j++) { current_sum += nums[j]; sums.push_back(current_sum); ids[current_sum].push_back(sums.size() - 1); } } //for (const auto& el: sums) { // printf("%lld ", el); //} //printf("\n"); unsigned long long int totals = 0; for (int i = 0; i < sums.size() - 2; i++) { long long int sum = 0; for (int j = i + 1; j < sums.size() - 1; j++) { sum = sums[i] + sums[j]; auto it = ids.find((-1) * sum); if (it != ids.end()) { list<size_t>& l = it->second; auto current = l.begin(); for (size_t k = 0; k < l.size(); k++) { if (*current > j) { totals += (l.size() - k); break; } ++current; } } } } printf("%llu\n", totals); return 0; } |
English