CF1299C Water Balance(單調棧)
阿新 • • 發佈:2020-08-25
顯然最終的答案是一個不降序列,因為一旦有下降,一定可以將兩段合併,這樣字典序更小
那麼其實就是不斷維護加入的過程,剛開始是一個數字一段,一旦前面的平均值大於等於準備插入的,那麼就一定要合併,因為這樣才能使最後的答案為不降序列
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; typedef pair<int,pll> plll; const int N=1e6+10; const int inf=0x3f3f3f3f; constView Codeint mod=1e9+7; struct node{ double sum; int l,r; }s[N]; int a[N]; int main(){ //ios::sync_with_stdio(false); int n; cin>>n; int i; for(i=1;i<=n;i++){ scanf("%d",&a[i]); } vector<node> num; num.clear(); num.push_back({(double)a[1],1,1}); for(i=2;i<=n;i++){ num.push_back({(double)a[i],i,i}); while((int)num.size()>1){ int len=(int)num.size(); auto x=num[len-2]; auto y=num[len-1]; if(x.sum/(x.r-x.l+1)>=(y.sum)/(y.r-y.l+1)){ num.pop_back(); num.pop_back(); num.push_back({y.sum+x.sum,x.l,y.r}); } else{ break; } } } for(auto x:num){ int i; for(i=x.l;i<=x.r;i++){ printf("%.9f\n",x.sum/(x.r-x.l+1)); } } return 0; }