#include <iostream>
#include <vector>
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
uint16_t n;
std::cin >> n;
std::vector<int16_t> a(n);
for (uint16_t i = 0; i < n; i++)
std::cin >> a[i];
std::vector<std::vector<int32_t> > sum(n + 1);
// Dynamik: sum[s][i] - suma elementów a[i .. i+s-1]
sum[1].resize(n);
for (uint16_t i = 0; i < n; i++)
sum[1][i] = a[i];
for (uint16_t s = 2; s <= n; s++)
{
int i_max = n - s;
sum[s].resize(i_max + 1);
for (uint16_t i = 0; i <= i_max; i++)
sum[s][i] = sum[s - 1][i] + a[i + (s - 1)];
}
uint32_t uc_size = n * (n + 1) / 2;
std::vector<int32_t> uc(uc_size);
uint32_t j = 0;
for (uint16_t i = 0; i < n; i++)
for (uint16_t s = 1; s <= n - i; s++, j++)
uc[j] = sum[s][i];
// Na razie brut, bo znalezione algorytmy 3SUM dają złe wyniki dla drugiego
// z przykładów (np. ten quadratic 3SUM z angielskiej wikipedii).
// Być może eliminują powtarzające się wyniki.
// A jak to są Ulubione Ciągi Bajtka, to może niech on sobie sam policzy?
uint32_t result = 0;
for (uint32_t i = 0; i < uc_size - 2; i++)
for (uint32_t j = i + 1; j < uc_size - 1; j++)
for (uint32_t k = j + 1; k < uc_size; k++)
if (uc[i] + uc[j] + uc[k] == 0)
result++;
std::cout << result << "\n";
// system("pause");
}
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 | #include <iostream> #include <vector> int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); uint16_t n; std::cin >> n; std::vector<int16_t> a(n); for (uint16_t i = 0; i < n; i++) std::cin >> a[i]; std::vector<std::vector<int32_t> > sum(n + 1); // Dynamik: sum[s][i] - suma elementów a[i .. i+s-1] sum[1].resize(n); for (uint16_t i = 0; i < n; i++) sum[1][i] = a[i]; for (uint16_t s = 2; s <= n; s++) { int i_max = n - s; sum[s].resize(i_max + 1); for (uint16_t i = 0; i <= i_max; i++) sum[s][i] = sum[s - 1][i] + a[i + (s - 1)]; } uint32_t uc_size = n * (n + 1) / 2; std::vector<int32_t> uc(uc_size); uint32_t j = 0; for (uint16_t i = 0; i < n; i++) for (uint16_t s = 1; s <= n - i; s++, j++) uc[j] = sum[s][i]; // Na razie brut, bo znalezione algorytmy 3SUM dają złe wyniki dla drugiego // z przykładów (np. ten quadratic 3SUM z angielskiej wikipedii). // Być może eliminują powtarzające się wyniki. // A jak to są Ulubione Ciągi Bajtka, to może niech on sobie sam policzy? uint32_t result = 0; for (uint32_t i = 0; i < uc_size - 2; i++) for (uint32_t j = i + 1; j < uc_size - 1; j++) for (uint32_t k = j + 1; k < uc_size; k++) if (uc[i] + uc[j] + uc[k] == 0) result++; std::cout << result << "\n"; // system("pause"); } |
English