Codeforces 1300E. Water Balance[单调栈]

    技术2023-10-31  89

    题目链接


    题目大意:给你一个长度为n的数组,你可以选择一段区间将这段区间的数全都变成这段区间的平均值,问你最后这个数组字典序最小是怎么样的


    解题思路:1.首先我们知道最后这个序列一定会变成一个单调上升的子序列 2.然后我们发现操作之后序列会变成一块一块的,每一块的数字都是相同的,那么我们可以按照分块的思想,如果这一块平均值比前面的小就合并到前面去


    #include <iostream> #include <cstdio> #include <stack> #include <sstream> #include <vector> #include <map> #include <cstring> #include <deque> #include <cmath> #include <iomanip> #include <queue> #include <algorithm> #include <set> #define mid ((l + r) >> 1) #define Lson rt << 1, l , mid #define Rson rt << 1|1, mid + 1, r #define ms(a,al) memset(a,al,sizeof(a)) #define log2(a) log(a)/log(2) #define _for(i,a,b) for( int i = (a); i < (b); ++i) #define _rep(i,a,b) for( int i = (a); i <= (b); ++i) #define for_(i,a,b) for( int i = (a); i >= (b); -- i) #define rep_(i,a,b) for( int i = (a); i > (b); -- i) #define lowbit(x) ((-x) & x) #define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define INF 0x3f3f3f3f #define hash Hash #define next Next #define count Count #define pb push_back #define Setw(a) fixed<<setprecision(a) #define f first #define s second using namespace std; const int N = 1e6+10, mod = 1e9 + 7; const double eps = 1e-10; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PII; template<typename T> void read(T &x) { x = 0;char ch = getchar();ll f = 1; while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();} while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f; } template<typename T, typename... Args> void read(T &first, Args& ... args) { read(first); read(args...); } double a[N], ans[N]; int block[N], l; int main() { int T; read(T); _for(i,1,T+1) read(a[i]); _for(i,1,T+1) { ans[++ l] = a[i]; block[l] = 1; while(l > 1 && ans[l] < ans[l - 1]) { ans[l - 1] = (ans[l] * block[l] + ans[l - 1] * block[l - 1]) / (block[l] + block[l - 1]); block[l - 1] = block[l - 1] + block[l]; l --; } } _for(i,1,l+1) _for(j,1,block[i]+1) cout <<Setw(10) << ans[i] << "\n"; return 0; }
    Processed: 0.011, SQL: 9