1. 程式人生 > 實用技巧 >CF1299C Water Balance(單調棧)

CF1299C Water Balance(單調棧)

顯然最終的答案是一個不降序列,因為一旦有下降,一定可以將兩段合併,這樣字典序更小

那麼其實就是不斷維護加入的過程,剛開始是一個數字一段,一旦前面的平均值大於等於準備插入的,那麼就一定要合併,因為這樣才能使最後的答案為不降序列

#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;
const
int 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; }
View Code