Skip to content

Instantly share code, notes, and snippets.

@magurofly
Created September 1, 2021 05:27
Show Gist options
  • Save magurofly/3ba197d58b9f95c6e804890095212e75 to your computer and use it in GitHub Desktop.
Save magurofly/3ba197d58b9f95c6e804890095212e75 to your computer and use it in GitHub Desktop.
謎のコード
#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