题解:CF1995C Squaring

题意

给定序列 a,每次操作可以使 aiai2,求使 a 不降的最少操作次数。

分析

因为 1k=1,所以无解的情况只有  ai=1 j[1,i),aj>1


在有解的情况下,假设对 ai1 操作 ki1 次,对 ai 操作 ki 次。

此时 ai1ai12ki1aiai2ki

因为单调不降,且序列中所有元素均为正数,所以满足:

ai12ki1ai2kilog2ai12ki1log2ai2ki2ki1log2ai12kilog2ailog2(2ki1log2ai1)log2(2kilog2ai)ki1+log2log2ai1ki+log2log2aiki1+log2log2ai1log2log2aiki

所以 ki 的最小取值为 ki1+log2log2ai1log2log2ai

注意 ki 不能取负数,所以 kimax(ki,0)

显然第一位不操作,故 k1=0

逐项处理即可。

答案就是 ki

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define eps 1e-8
int a[maxn];
void solve()
{
int64_t n, ans=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int la=0;
for(int i=2;i<=n;i++)
{
if(a[i]==1&&a[i-1]!=1) return cout<<-1<<'\n', void();
la=max((int)ceil(la+log2(log2(a[i-1]))-log2(log2(a[i]))-eps), 0);
ans+=la;
}
cout<<ans<<'\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int t;
cin>>t;
while(t--) solve();
}

本文作者:Jimmy-LEEE

本文链接:https://www.cnblogs.com/redacted-area/p/18379559

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Jimmy-LEEE  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起