b_mt_prev[i] * i 之和(set.lower_bound--)
阿新 • • 發佈:2021-08-08
有一個長度為的序列 A,定義序列中第 i 個數的 prev[i] 的值為前 i-1 個數中比 A[i] 小的最大的值,即滿足 1<j<i,且 A[j] < A[i] 中最大的 A[j],若不存在這樣的數,則 prev[i] 的值為 0。現在計算對於所有的 prev[i]i 之和是多少, 即(sum(prev[i]i)(1<=i<=n)
輸入描述
第一行是一個整數n表示序列的長度。
接下來行n個 數用空格隔開, 第1個數表示間的大小。
輸出描述
一行個整數,表示答案。
輸入
5
1 6 3 3 8
樣例輸出
39
提示
100%的資料保證n<=100000, 1<=A[i]<=100000。
思路:...
#include<bits/stdc++.h> using namespace std; int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; int s = 0; set<int> st; int x = 0; for (int i = 1; i <= n; i++) { cin >> x; auto prev_iter = st.lower_bound(x); if (prev_iter != st.begin()) { prev_iter--; s += *prev_iter * i; } st.insert(x); } cout << s; return 0; }