zoukankan      html  css  js  c++  java
  • 牛客 位数差(二分)

    通过式子转化,考虑贡献,设bit(x)为x的位数,答案为所有组合的位数-(n-i)*a[i]的位数

    后一个式子可以读入处理,前一个式子先排序后用二分找到变化边界,从大往小遍历二分,答案只有位数+1或者跟原位数相符。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+10;
    int a[N];
    int bi[N];
    int get(int x){
        int res=0;
        if(x==0)
        return 1;
        while(x){
            res++;
            x/=10;
        }
        return res;
    }
    int main(){
        int i;
        int n;
        cin>>n;
        ll sum=0;
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            sum-=(n-i)*get(a[i]);
        }
        sort(a+1,a+1+n);
        reverse(a+1,a+1+n);
        for(int i=1;i<n;i++)
        {
            int l=i+1,r=n,mid;
            while(l<r)
            {
                mid=(l+r)/2;
                if(get(a[i]+a[mid])>get(a[i])) l=mid+1;
                else r=mid;
            }
            sum+=ll((r-1-i)*(get(a[i])+1)+(n-r+1)*get(a[i]));
        }
        cout<<sum<<endl;
    }
    View Code
  • 相关阅读:
    Oracle条件分支查询
    Oracle分组函数实例
    使用JDK合成照片
    Oracle存储过程记录异常日志
    Emmet Cheat Sheet(Sublime编辑)
    JS中级
    JS中级
    架构师必须知道的架构设计原则
    JS中级
    JS中级
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12937193.html
Copyright © 2011-2022 走看看