#include <algorithm>
#include <cstdint>
#include <iostream>
#include <map>
#include <set>
#include <tuple>
#include <vector>
using namespace std;
#define N 500
typedef tuple<int, int> tii;
typedef tuple<int, int, int> tiii;
int A[N];
int C[N + 1];
int PERMS3[6][3] = {{0, 1, 2}, {0, 2, 1}, {1, 0, 2},
{1, 2, 0}, {2, 0, 1}, {2, 1, 0}};
template <typename T> bool all_unique(T a, T b, T c) {
return a != b && a != c && b != c;
}
bool valid(tiii idxs1, tiii idxs2) {
int i = get<0>(idxs1), j = get<1>(idxs1), k = get<2>(idxs1);
int ii = get<0>(idxs2), jj = get<1>(idxs2), kk = get<2>(idxs2);
return (i < ii && j < jj && k < kk &&
all_unique(make_pair(i, ii), make_pair(j, jj), make_pair(k, kk)));
}
int count_valid(tiii idxs1, tiii idxs2) {
tii tmp[3];
set<tuple<tii, tii, tii>> ok;
for (size_t i = 0; i < 6; i++) {
int aidxs1[3] = {get<0>(idxs1), get<1>(idxs1), get<2>(idxs1)};
tiii permidxs1 = {aidxs1[PERMS3[i][0]], aidxs1[PERMS3[i][1]],
aidxs1[PERMS3[i][2]]};
if (valid(permidxs1, idxs2)) {
tmp[0] = make_pair(get<0>(permidxs1), get<0>(idxs2));
tmp[1] = make_pair(get<1>(permidxs1), get<1>(idxs2));
tmp[2] = make_pair(get<2>(permidxs1), get<2>(idxs2));
sort(tmp, tmp + 3);
ok.insert({tmp[0], tmp[1], tmp[2]});
}
}
return ok.size();
}
int main(int argc, char *argv[]) {
ios_base::sync_with_stdio(0);
size_t n;
uint64_t out = 0;
int v, s = 0;
cin >> n;
C[0] = s = 0;
for (size_t i = 0; i < n; i++) {
cin >> v;
A[i] = v;
s += v;
C[i + 1] = s;
}
map<int, vector<tiii>> d;
n += 1;
for (size_t i = 0; i < n; i++) {
for (size_t j = i; j < n; j++) {
for (size_t k = j; k < n; k++) {
v = C[i] + C[j] + C[k];
if (!d.contains(v)) {
d[v] = vector<tiii>();
}
d[v].push_back({i, j, k});
}
}
}
for (auto dit = d.begin(); dit != d.end(); dit++) {
auto v = dit->second;
for (auto vit1 = v.begin(); vit1 != v.end(); vit1++) {
for (auto vit2 = vit1 + 1; vit2 != v.end(); vit2++) {
out += count_valid(*vit1, *vit2);
}
}
}
cout << out << endl;
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 | #include <algorithm> #include <cstdint> #include <iostream> #include <map> #include <set> #include <tuple> #include <vector> using namespace std; #define N 500 typedef tuple<int, int> tii; typedef tuple<int, int, int> tiii; int A[N]; int C[N + 1]; int PERMS3[6][3] = {{0, 1, 2}, {0, 2, 1}, {1, 0, 2}, {1, 2, 0}, {2, 0, 1}, {2, 1, 0}}; template <typename T> bool all_unique(T a, T b, T c) { return a != b && a != c && b != c; } bool valid(tiii idxs1, tiii idxs2) { int i = get<0>(idxs1), j = get<1>(idxs1), k = get<2>(idxs1); int ii = get<0>(idxs2), jj = get<1>(idxs2), kk = get<2>(idxs2); return (i < ii && j < jj && k < kk && all_unique(make_pair(i, ii), make_pair(j, jj), make_pair(k, kk))); } int count_valid(tiii idxs1, tiii idxs2) { tii tmp[3]; set<tuple<tii, tii, tii>> ok; for (size_t i = 0; i < 6; i++) { int aidxs1[3] = {get<0>(idxs1), get<1>(idxs1), get<2>(idxs1)}; tiii permidxs1 = {aidxs1[PERMS3[i][0]], aidxs1[PERMS3[i][1]], aidxs1[PERMS3[i][2]]}; if (valid(permidxs1, idxs2)) { tmp[0] = make_pair(get<0>(permidxs1), get<0>(idxs2)); tmp[1] = make_pair(get<1>(permidxs1), get<1>(idxs2)); tmp[2] = make_pair(get<2>(permidxs1), get<2>(idxs2)); sort(tmp, tmp + 3); ok.insert({tmp[0], tmp[1], tmp[2]}); } } return ok.size(); } int main(int argc, char *argv[]) { ios_base::sync_with_stdio(0); size_t n; uint64_t out = 0; int v, s = 0; cin >> n; C[0] = s = 0; for (size_t i = 0; i < n; i++) { cin >> v; A[i] = v; s += v; C[i + 1] = s; } map<int, vector<tiii>> d; n += 1; for (size_t i = 0; i < n; i++) { for (size_t j = i; j < n; j++) { for (size_t k = j; k < n; k++) { v = C[i] + C[j] + C[k]; if (!d.contains(v)) { d[v] = vector<tiii>(); } d[v].push_back({i, j, k}); } } } for (auto dit = d.begin(); dit != d.end(); dit++) { auto v = dit->second; for (auto vit1 = v.begin(); vit1 != v.end(); vit1++) { for (auto vit2 = vit1 + 1; vit2 != v.end(); vit2++) { out += count_valid(*vit1, *vit2); } } } cout << out << endl; return 0; } |
English