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;
}

浙公网安备 33010602011771号