Codeforces Round #701 (Div. 2) 补题 AB

A. Add and Divide

在这里插入图片描述
分析: 暴力枚举 b + x b+x b+x的每个操作次数,只需要枚举 l o g 2 ( 1 0 9 ) = 29 log_2(10^9)=29 log2(109)=29

代码:

#include<bits/stdc++.h>
using namespace std;
int t,a,b;
int main(){
    
    
    cin>>t;
    while(t--){
    
    
        int ans=1000;
        cin>>a>>b;
        int tmp=b;
        if(tmp==1) tmp++;
        for(int i=tmp;i<tmp+30;i++){
    
    
            int res=0,ta=a;
            while(ta>=i){
    
    
                ta/=i;
                res++;
            }
            ans=min(res+1+i-b,ans);
        }
        cout<<ans<<endl;
    }
}

B. Replace and Keep Sorted

在这里插入图片描述

分析:
结论: 答 案 : k + a [ r ] − a [ l ] − 1 − 2 r + 2 l 答案:k+a[r]-a[l]-1-2r+2l k+a[r]a[l]12r+2l

推导:
设左区间为 l l l,右区间为 r r r
对于左区间端点:
a [ l ] − 1 a[l]-1 a[l]1
对于右区间端点:
k − a [ r ] k-a[r] ka[r]
其他点 i i i
( a [ i ] − a [ i − 1 ] − 1 ) + ( a [ i + 1 ] − a [ i ] − 1 ) (a[i]-a[i-1]-1)+(a[i+1]-a[i]-1) (a[i]a[i1]1)+(a[i+1]a[i]1)
= a [ i + 1 ] − a [ i − 1 ] − 2 =a[i+1]-a[i-1]-2 =a[i+1]a[i1]2
为什么不用计算左右端点的另一边?因为下一个点/上一个点还会计算差值

累加:
∑ i = l + 1 r − 1 a [ i + 1 ] − a [ i − 1 ] − 2 \sum_{i=l+1}^{r-1}a[i+1]-a[i-1]-2 i=l+1r1a[i+1]a[i1]2
= a [ r ] − a [ l ] − 2 ( r − l − 1 ) =a[r]-a[l]-2(r-l-1) =a[r]a[l]2(rl1)
加上两个端点的值:
k + a [ r ] − a [ l ] − 1 − 2 r + 2 l k+a[r]-a[l]-1-2r+2l k+a[r]a[l]12r+2l

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,k,a[N],l,r;
int main(){
    
    
    cin>>n>>q>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    while(q--){
    
    
        cin>>l>>r;
        cout<<k+a[r]-a[l]-1-2*r+2*l<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/messywind/article/details/113802397