色んな解法がありそう。今回は、あまり解説書かずに備忘録程度に。
問題概要
長さ の数列 がある。各要素は 以上 以下の整数値である。
制約
メモ
各値ごとに考えていった。つまり、 として、 について求めていった。
各 について、 となる添字 を集めてあげて、それをもとに計算していく。全体の計算量は となる。
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; vector<int> A(N); vector<vector<int>> ind(N+1); for (int i = 0; i < N; ++i) { cin >> A[i]; ind[A[i]].push_back(i); } long long res = 0; for (int i = 0; i <= N; ++i) { vector<long long> diffs; for (int j = 0; j+1 < ind[i].size(); ++j) { diffs.push_back(ind[i][j+1] - ind[i][j] - 1); } long long s = diffs.size(); for (long long j = 0; j < s; ++j) { res += diffs[j] * (s - j) * (j + 1); } } cout << res << endl; }