Submission #905790
Source Code Expand
#include<bits/stdc++.h> using namespace std; typedef long long int64; struct UnionFind { vector< int > data; UnionFind(int sz) { data.assign(sz, -1); } void unite(int x, int y) { x = find(x), y = find(y); if(x != y) { if(data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; } } int find(int k) { if(data[k] < 0) return (k); return (data[k] = find(data[k])); } int size(int k) { return (-data[find(k)]); } }; int main() { int N, A[200000]; cin >> N; for(int i = 0; i < N; ++i) { cin >> A[i]; } vector< int > idx(N); iota(begin(idx), end(idx), 0); sort(begin(idx), end(idx), [&](int a, int b) { return (A[a] > A[b]); }); int64 ret = 0; UnionFind tree(N); for(int& i : idx) { int Left = 1, Right = 1; if(i > 0 && A[i] < A[i - 1]) { Left += tree.size(i - 1); tree.unite(i - 1, i); } if(i + 1 < N && A[i] < A[i + 1]) { Right += tree.size(i + 1); tree.unite(i + 1, i); } ret += 1LL * A[i] * Left * Right; } cout << ret << endl; }
Submission Info
Submission Time | |
---|---|
Task | B - Minimum Sum |
User | ei13333 |
Language | C++14 (GCC 5.4.1) |
Score | 400 |
Code Size | 1171 Byte |
Status | AC |
Exec Time | 86 ms |
Memory | 2560 KB |
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 400 / 400 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | example0, example1, example2 |
All | corner0, corner1, corner2, corner3, example0, example1, example2, maxrand0, maxrand1, maxrand2, rand0, rand1, rand2 |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
corner0 | AC | 67 ms | 2560 KB |
corner1 | AC | 68 ms | 2560 KB |
corner2 | AC | 3 ms | 256 KB |
corner3 | AC | 83 ms | 2560 KB |
example0 | AC | 2 ms | 256 KB |
example1 | AC | 3 ms | 256 KB |
example2 | AC | 2 ms | 384 KB |
maxrand0 | AC | 85 ms | 2560 KB |
maxrand1 | AC | 85 ms | 2560 KB |
maxrand2 | AC | 86 ms | 2560 KB |
rand0 | AC | 2 ms | 256 KB |
rand1 | AC | 3 ms | 256 KB |
rand2 | AC | 3 ms | 256 KB |