标签:最大值 一个 第一个 ORC air class pop top 位置
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> PII; #define ls l,mid,rt<<1 #define rs mid+1,r,rt<<1|1 #define endl ‘\n‘ const int MAXN = 1e6+10; const double EPS = 1e-12; const ll mod = 1e9+7; int n; ll a[MAXN],l[MAXN],r[MAXN]; stack<int>st; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); for(int i=1;i<=n;i++){ while(!st.empty()&&a[st.top()]>=a[i])st.pop(); if(st.empty())l[i]=a[i]*i; else l[i]=l[st.top()]+a[i]*(i-st.top()); st.push(i); } while(!st.empty())st.pop(); for(int i=n;i>=1;i--){ while(!st.empty()&&a[st.top()]>=a[i])st.pop(); if(st.empty())r[i]=a[i]*(n-i+1); else r[i]=r[st.top()]+a[i]*(st.top()-i); st.push(i); } ll maxx=0,id=0; for(int i=1;i<=n;i++){ if(l[i]+r[i]-a[i]>maxx){ maxx=l[i]+r[i]-a[i]; id=i; } } for(int i=id-1;i>=1;i--)a[i]=min(a[i],a[i+1]); for(int i=id+1;i<=n;i++)a[i]=min(a[i],a[i-1]); for(int i=1;i<=n;i++)cout<<a[i]<<" "; }
Codeforces Round #622 (Div.2) C2.Skyscrapers(hard version)
标签:最大值 一个 第一个 ORC air class pop top 位置
原文地址:https://www.cnblogs.com/Mmasker/p/12374087.html