Submission #1253034

#TimeUsernameProblemLanguageResultExecution timeMemory
1253034walrusramen21Triple Peaks (IOI25_triples)C++20
23.29 / 100
2096 ms2492 KiB
#include "triples.h" #include <algorithm> #include <array> #include <iterator> #include <cassert> #include <iostream> long long count_triples(std::vector<int> H) { int N = H.size(); long long ans = 0; // remember we have j-i, k-j, and (j-i) + (k-j) for (int i = 0; i < N; i++) { for (int j = i+1; j < N; j++) { // we have three cases: is H[i], H[j], or H[k] biggest? // CASE 1 // if H[k] is biggest, then either H[i] = j-i and H[j] = k-j // or H[i] = k-j and H[j] = j-i // if H[i] = j-i and H[j] = k-j, then H[k] = H[i] + H[j] // k = (k-j) + (j-i) + i = H[j] + H[i] + i // if H[j] = j-i and H[i] = k-j, then still H[k] = H[i] + H[j] // and k = H[i] + H[j] + i // both sub-cases are the same equation int k = H[i] + H[j] + i; if (0 <= k && k < N && k != i && k != j && H[k] == H[i] + H[j] && (H[i] == j-i || H[j] == j-i)) { // std::cout << i << ' ' << j << ' ' << k << ' ' << "(H[k] is biggest)" << '\n'; ++ans; } // CASE 2 // if H[i] is biggest, H[i] = k-i // either H[j] = j-i, or H[j] = k-j // if H[i] = k-i, H[j] = j-i, H[k] = k-j // then H[k] = H[i] - H[j], and k = H[i] - H[j] + j // if H[i] = k-i, H[j] = k-j, H[k] = j-i // H[k] = H[i] - H[j], k = H[i] + i = H[j] + j int k1 = H[i] - H[j] + j; int k2 = H[i] + i; if (0 <= k1 && k1 < N && k1 != i && k1 != j && H[k1] == H[i] - H[j] && H[j] == j-i) { // std::cout << i << ' ' << j << ' ' << k1 << ' ' << "(H[i] is biggest)" << '\n'; ++ans; } if (k2 != k1 && 0 <= k2 && k2 < N && k2 == H[j] + j && k2 != i && k2 != j && H[k2] == H[i] - H[j] && H[i] == k2-i) { // std::cout << i << ' ' << j << ' ' << k2 << ' ' << "(H[i] is biggest)" << '\n'; ++ans; } // CASE 3 // if H[j] is biggest, then we got two cases (again!) // H[i] = j-i, H[j] = k-i, H[k] = k-j // H[k] = H[j] - H[i], k = H[j] + i // H[i] = k-j, H[j] = k-i, H[k] = j-i // H[k] = H[j] - H[i], k = H[i] + j = H[j] + i // note that this means if k exists in the latter case, it should alr satisfy the former case k = H[j] + i; if (0 <= k && k < N && k != i && k != j && H[k] == H[j] - H[i] && (H[i] == j-i || H[i] == k-j)) { // std::cout << i << ' ' << j << ' ' << k << ' ' << "(H[j] is biggest)" << '\n'; ++ans; } } } return ans; } std::vector<int> construct_range(int M, int K) { std::vector<int> ans; ans.push_back(1); ans.push_back(1); for (int i = 2; i < M; i++) { ans.push_back(i); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...