CF1338A

题目简化和分析:

  • \(a_{i}\ge a_{i-1}\) 已经满足直接跳过

  • \(a_{i}<a_{i-1}\) 我们就要将其的差进行二进制的分解,使得 \(a_{i-1}=a_i\)

我也不知道一开始我怎么想的还开了个 \(f\) 数组。

\(f_i=f_{i-1}+(2^{f_{i-1}}=i)\) 这部妥妥的 MLE。

所以还是暴力吧,毕竟二进制也快。

Solution:

注意以下代码的 for 循环 k 的初始值,估计是太大会 UB?

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef double db;

const int N=1e5+50;
const int M=1e5+50;
const int Mod=1e9+7;

inline ll read(){
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
ll t,n;
ll a[N];
int main()
{
	t=read();
	while(t--){
		n=read();
		for(int i=1;i<=n;++i){
			a[i]=read();	
		}
		ll ans=0;
		for(int i=2;i<=n;++i){
			if(a[i]>=a[i-1]) continue;
			for(ll k=31;k>=1;--k){
				if(a[i]+(1<<k-1)<=a[i-1])
				{
					a[i]+=(1<<k-1);
					ans=max(ans,k);
				}
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

posted @ 2022-08-02 08:23  RVG  阅读(28)  评论(0)    收藏  举报