結果
| 問題 |
No.2950 Max Min Product
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-10-25 23:31:43 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 544 ms / 3,000 ms |
| コード長 | 1,498 bytes |
| コンパイル時間 | 6,148 ms |
| コンパイル使用メモリ | 319,216 KB |
| 実行使用メモリ | 11,892 KB |
| 最終ジャッジ日時 | 2024-10-25 23:32:16 |
| 合計ジャッジ時間 | 20,428 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll=long long;
using mint=modint998244353;
mint op(mint x,mint y){
return x+y;
}
mint e(){
return 0;
}
mint mapping(mint x,mint y){
return x*y;
}
mint composition(mint x,mint y){
return x*y;
}
mint id(){
return 1;
}
int main()
{
int n;
cin>>n;
vector<ll> a(n);
for(int i=0;i<n;i++)cin>>a[i];
deque<int> deq[2];
mint ans=a[0]*a[0],sum=a[0]*a[0];
lazy_segtree<mint,op,e,mint,mapping,composition,id> lst0(n),lst1(n);
deq[0].push_back(0);
deq[1].push_back(0);
lst0.set(0,a[0]);
lst1.set(0,a[0]);
for(int i=1;i<n;i++){
int p;
while(!deq[0].empty()&&a[deq[0].back()]>a[i]){
int x=deq[0].back();
deq[0].pop_back();
if(deq[0].empty())p=0;
else p=deq[0].back()+1;
sum-=(a[x]-a[i])*lst1.prod(p,x+1);
lst0.apply(p,x+1,(mint)a[i]/a[x]);
}
deq[0].push_back(i);
while(!deq[1].empty()&&a[deq[1].back()]<a[i]){
int x=deq[1].back();
deq[1].pop_back();
if(deq[1].empty())p=0;
else p=deq[1].back()+1;
sum-=(a[x]-a[i])*lst0.prod(p,x+1);
lst1.apply(p,x+1,(mint)a[i]/a[x]);
}
deq[1].push_back(i);
sum+=a[i]*a[i];
ans+=sum;
lst0.set(i,a[i]);
lst1.set(i,a[i]);
}
cout<<ans.val()<<endl;
return 0;
}