Created
September 1, 2021 05:27
-
-
Save magurofly/3ba197d58b9f95c6e804890095212e75 to your computer and use it in GitHub Desktop.
謎のコード
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <algorithm> | |
#include <array> | |
#include <cassert> | |
#include <cstdint> | |
#include <functional> | |
#include <iostream> | |
#include <numeric> | |
#include <string> | |
#include <tuple> | |
#include <vector> | |
int64_t solve(int64_t n, std::vector<int64_t> a) { | |
// assert | |
assert (- n + 2 <= 0 and n - 200000 <= 0); | |
assert (- n + int64_t(a.size()) == 0); | |
for (int64_t x : a) { | |
assert (- x - 1000000000000000000ll <= 0 and x - 1000000000000000000ll <= 0); | |
} | |
// ソート | |
std::sort(a.begin(), a.end()); | |
// 累積和 | |
std::vector<int64_t> a_sum(a.size() + 1); | |
a_sum[0] = 0; | |
for (int32_t i = 0; i < int32_t(a.size()); ++ i) { | |
a_sum[i + 1] = a_sum[i] + a[i]; | |
} | |
// 累積積 | |
std::vector<int64_t> a_prod(n); | |
for (int32_t i = 0; i < int32_t(n); ++ i) { | |
a_prod[i] = i * a[i]; | |
} | |
// 累積積の総和 | |
int64_t a_prod_sum = std::accumulate(a_prod.begin(), a_prod.end(), 0); | |
// 累積和 | |
std::vector<int64_t> a_sum2(a.size() + 1); | |
a_sum2[0] = 0; | |
for (int32_t i = 0; i < int32_t(a.size()); ++ i) { | |
a_sum2[i + 1] = a_sum2[i] + a[i]; | |
} | |
// 右からの累積和 | |
std::vector<int64_t> a2(n); | |
for (int32_t i = 0; i < int32_t(n); ++ i) { | |
a2[i] = a_sum2[n] - a_sum2[i + 1]; | |
} | |
int64_t a2_sum = std::accumulate(a2.begin(), a2.end(), 0); | |
// 累積和 | |
std::vector<int64_t> a_sum3(a.size() + 1); | |
a_sum3[0] = 0; | |
for (int32_t i = 0; i < int32_t(a.size()); ++ i) { | |
a_sum3[i + 1] = a_sum3[i] + a[i]; | |
} | |
return - (n * a_sum[n]) + a_prod_sum + a2_sum + a_sum3[n]; | |
} | |
int main() { | |
int64_t n_1570 = -1; | |
std::cin >> n_1570; | |
std::vector<int64_t> a_1571(n_1570, -1); | |
for (int32_t i1572 = 0; i1572 < n_1570; ++ i1572) { | |
std::cin >> a_1571[i1572]; | |
} | |
auto ans_1573 = solve(n_1570, a_1571); | |
std::cout << ans_1573 << ' '; | |
std::cout << '\n' << ' '; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment