提出 #66115050
ソースコード 拡げる
#line 2 "Library/Template.hpp"
/**
* @file Template.hpp
* @author log K (lX57)
* @brief Template - テンプレート
* @version 1.10
* @date 2025-03-16
*/
#line 2 "Library/Common.hpp"
/**
* @file Common.hpp
*/
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cstdint>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;
using ll = int64_t;
using ull = uint64_t;
constexpr const ll INF = (1LL << 62) - (3LL << 30) - 1;
#line 12 "Library/Template.hpp"
inline bool YnPrint(bool flag){cout << (flag ? "Yes" : "No") << '\n'; return flag;}
inline bool YNPrint(bool flag){cout << (flag ? "YES" : "NO") << '\n'; return flag;}
template<typename Container>
inline void Sort(Container &container){sort(container.begin(), container.end());}
template<typename Container>
inline void ReverseSort(Container &container){sort(container.rbegin(), container.rend());}
template<typename Container>
inline void Reverse(Container &container){reverse(container.begin(), container.end());}
template<typename Value>
inline int PopCount(const Value &value){return __builtin_popcount(value);}
template<typename Value>
inline Value Floor(const Value &numerator, const Value &denominator){if(denominator < 0) numerator *= -1, denominator *= -1; return numerator < 0 ? (numerator + 1) / denominator - 1 : numerator / denominator;}
template<typename Value>
inline Value Ceil(const Value &numerator, const Value &denominator){if(denominator < 0) numerator *= -1, denominator *= -1; return numerator > 0 ? (numerator - 1) / denominator + 1 : numerator / denominator;}
template<typename Value>
inline int LowerBoundIndex(const vector<Value> &container, const Value &value){return distance(container.begin(), lower_bound(container.begin(), container.end(), value));}
template<typename Value>
inline int UpperBoundIndex(const vector<Value> &container, const Value &value){return distance(container.begin(), upper_bound(container.begin(), container.end(), value));}
template<typename Value>
inline bool Between(const Value &lower, const Value &x, const Value &higher){return lower <= x && x <= higher;}
template<typename Value>
inline bool InGrid(const Value &y, const Value &x, const Value &ymax, const Value &xmax){return Between(0, y, ymax - 1) && Between(0, x, xmax - 1);}
template<typename Value>
inline Value Median(const Value &a, const Value &b, const Value &c){return Between(b, a, c) || Between(c, a, b) ? a : (Between(a, b, c) || Between(c, b, a) ? b : c);}
template<typename Value>
inline Value Except(Value &src, Value &cond, Value &excp){return (src == cond ? excp : src);}
template<class Value>
bool chmin(Value &src, const Value &cmp){if(src > cmp){src = cmp; return true;} return false;}
template<class Value>
bool chmax(Value &src, const Value &cmp){if(src < cmp){src = cmp; return true;} return false;}
template<typename Value>
inline Value min(vector<Value> &v){return *min_element((v).begin(), (v).end());}
template<typename Value>
inline Value max(vector<Value> &v){return *max_element((v).begin(), (v).end());}
const int dx4[4] = {1, 0, -1, 0};
const int dy4[4] = {0, -1, 0, 1};
const int dx8[8] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dy8[8] = {0, -1, -1, -1, 0, 1, 1, 1};
vector<pair<int, int>> adjacent(int current_y, int current_x, int max_y, int max_x, bool dir_8 = false){
vector<pair<int, int>> ret;
for(int d = 0; d < 4 * (1 + dir_8); ++d){
int next_y = current_y + (dir_8 ? dy8[d] : dy4[d]);
int next_x = current_x + (dir_8 ? dx8[d] : dx4[d]);
if(InGrid(next_y, next_x, max_y, max_x)){
ret.emplace_back(next_y, next_x);
}
}
return ret;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p){
os << p.first << " " << p.second;
return os;
}
template <typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p){
is >> p.first >> p.second;
return is;
}
template <typename T>
ostream &operator<<(ostream &os, vector<T> &v){
for (int i = 0; i < v.size(); ++i){
os << v[i] << (i + 1 != v.size() ? " " : "");
}
return os;
}
template <typename T>
ostream &operator<<(ostream &os, vector<vector<T>> &v){
for (int i = 0; i < v.size(); ++i){
os << v[i] << (i + 1 != v.size() ? "\n" : "");
}
return os;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &v){
for (int i = 0; i < v.size(); ++i) is >> v[i];
return is;
}
template <typename T>
ostream &operator<<(ostream &os, set<T> &v){
for (auto &u : v){
os << u << " ";
}
return os;
}
template<typename T1, typename T2>
vector<pair<T1, T2>> AssembleVectorPair(vector<T1> &v1, vector<T2> &v2){
assert(v1.size() == v2.size());
vector<pair<T1, T2>> v;
for(int i = 0; i < v1.size(); ++i) v.push_back({v1[i], v2[i]});
return v;
}
template<typename T1, typename T2>
pair<vector<T1>, vector<T2>> DisassembleVectorPair(vector<pair<T1, T2>> &v){
vector<T1> v1;
vector<T2> v2;
transform(v.begin(), v.end(), back_inserter(v1), [](auto p){return p.first;});
transform(v.begin(), v.end(), back_inserter(v2), [](auto p){return p.second;});
return {v1, v2};
}
template<typename T1, typename T2, typename T3>
tuple<vector<T1>, vector<T2>, vector<T3>> DisassembleVectorTuple(vector<tuple<T1, T2, T3>> &v){
vector<T1> v1;
vector<T2> v2;
vector<T3> v3;
transform(v.begin(), v.end(), back_inserter(v1), [](auto p){return get<0>(p);});
transform(v.begin(), v.end(), back_inserter(v2), [](auto p){return get<1>(p);});
transform(v.begin(), v.end(), back_inserter(v3), [](auto p){return get<2>(p);});
return {v1, v2, v3};
}
template<typename T1 = int, typename T2 = T1>
pair<vector<T1>, vector<T2>> InputVectorPair(int size){
vector<pair<T1, T2>> v(size);
for(auto &[p, q] : v) cin >> p >> q;
return DisassembleVectorPair(v);
}
template<typename T1 = int, typename T2 = T1, typename T3 = T1>
tuple<vector<T1>, vector<T2>, vector<T3>> InputVectorTuple(int size){
vector<tuple<T1, T2, T3>> v(size);
for(auto &[p, q, r] : v) cin >> p >> q >> r;
return DisassembleVectorTuple(v);
}
#line 2 "ABC407/F.cpp"
// ===================================================================
//
// Main Program
//
// Contest : ABC407
// Problem : F
// Date : 2025-05-24 20:54:02
//
// ===================================================================
void solve(){
int N; cin >> N;
int M = N + 2;
vector<ll> A(M);
for(int i = 1; i <= N; ++i) cin >> A[i];
vector<int> l(M), r(M);
{
stack<int> st;
for(int i = 1; i <= N; ++i){
while(st.size() and A[st.top()] <= A[i]) st.pop();
l[i] = (!st.size() ? 0 : st.top());
st.push(i);
}
}
{
stack<int> st;
for(int i = N; i >= 1; --i){
while(st.size() and A[st.top()] < A[i]) st.pop();
r[i] = (!st.size() ? N + 1 : st.top());
st.push(i);
}
}
vector<ll> p(M + 1, 0), q(M + 1, 0);
for(int i = 1; i <= N; ++i){
ll L = i - l[i], R = r[i] - i;
ll mi = min(L, R), ma = max(L, R), w = L + R - 1;
if(mi >= 1){
p[1] += A[i], p[mi + 1] -= A[i];
}
if(ma >= mi + 1){
q[mi + 1] += A[i] * mi, q[ma + 1] -= A[i] * mi;
}
if(w >= ma + 1){
p[ma + 1] -= A[i], p[w + 1] += A[i];
q[ma + 1] += A[i] * (L + R), q[w + 1] -= A[i] * (L + R);
}
}
vector<ll> P(M, 0), Q(M, 0);
for(int i = 1; i <= N; ++i){
P[i] = P[i - 1] + p[i];
Q[i] = Q[i - 1] + q[i];
}
for(int i = 1; i <= N; ++i){
ll ans = P[i] * i + Q[i];
cout << ans << endl;
}
}
int main(){
cin.tie(0)->sync_with_stdio(false);
cout << fixed << setprecision(10);
// int T; cin >> T;
// while(T--)
solve();
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
550 / 550 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
00-sample-01.txt, 00-sample-02.txt, 00-sample-03.txt |
| All |
00-sample-01.txt, 00-sample-02.txt, 00-sample-03.txt, 01-small-01.txt, 01-small-02.txt, 01-small-03.txt, 01-small-04.txt, 01-small-05.txt, 01-small-06.txt, 01-small-07.txt, 01-small-08.txt, 01-small-09.txt, 01-small-10.txt, 01-small-11.txt, 01-small-12.txt, 01-small-13.txt, 01-small-14.txt, 01-small-15.txt, 01-small-16.txt, 01-small-17.txt, 01-small-18.txt, 01-small-19.txt, 01-small-20.txt, 01-small-21.txt, 01-small-22.txt, 01-small-23.txt, 01-small-24.txt, 02-large-01.txt, 02-large-02.txt, 02-large-03.txt, 02-large-04.txt, 02-large-05.txt, 02-large-06.txt, 02-large-07.txt, 02-large-08.txt, 02-large-09.txt, 02-large-10.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 00-sample-01.txt |
AC |
1 ms |
3424 KiB |
| 00-sample-02.txt |
AC |
1 ms |
3480 KiB |
| 00-sample-03.txt |
AC |
1 ms |
3424 KiB |
| 01-small-01.txt |
AC |
1 ms |
3492 KiB |
| 01-small-02.txt |
AC |
1 ms |
3436 KiB |
| 01-small-03.txt |
AC |
1 ms |
3504 KiB |
| 01-small-04.txt |
AC |
1 ms |
3504 KiB |
| 01-small-05.txt |
AC |
1 ms |
3420 KiB |
| 01-small-06.txt |
AC |
1 ms |
3500 KiB |
| 01-small-07.txt |
AC |
1 ms |
3632 KiB |
| 01-small-08.txt |
AC |
1 ms |
3416 KiB |
| 01-small-09.txt |
AC |
1 ms |
3432 KiB |
| 01-small-10.txt |
AC |
1 ms |
3416 KiB |
| 01-small-11.txt |
AC |
1 ms |
3436 KiB |
| 01-small-12.txt |
AC |
1 ms |
3496 KiB |
| 01-small-13.txt |
AC |
1 ms |
3488 KiB |
| 01-small-14.txt |
AC |
1 ms |
3432 KiB |
| 01-small-15.txt |
AC |
3 ms |
3464 KiB |
| 01-small-16.txt |
AC |
3 ms |
3524 KiB |
| 01-small-17.txt |
AC |
3 ms |
3604 KiB |
| 01-small-18.txt |
AC |
3 ms |
3604 KiB |
| 01-small-19.txt |
AC |
3 ms |
3596 KiB |
| 01-small-20.txt |
AC |
3 ms |
3588 KiB |
| 01-small-21.txt |
AC |
3 ms |
3592 KiB |
| 01-small-22.txt |
AC |
3 ms |
3536 KiB |
| 01-small-23.txt |
AC |
3 ms |
3584 KiB |
| 01-small-24.txt |
AC |
3 ms |
3732 KiB |
| 02-large-01.txt |
AC |
200 ms |
12672 KiB |
| 02-large-02.txt |
AC |
204 ms |
12568 KiB |
| 02-large-03.txt |
AC |
191 ms |
12544 KiB |
| 02-large-04.txt |
AC |
201 ms |
12580 KiB |
| 02-large-05.txt |
AC |
203 ms |
12572 KiB |
| 02-large-06.txt |
AC |
201 ms |
12548 KiB |
| 02-large-07.txt |
AC |
203 ms |
12564 KiB |
| 02-large-08.txt |
AC |
203 ms |
12480 KiB |
| 02-large-09.txt |
AC |
203 ms |
12812 KiB |
| 02-large-10.txt |
AC |
203 ms |
12528 KiB |