位数差(二分)

 

 AC_Code

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1e5+5;
 5 const int inf=0x3f3f3f3f;
 6 #define rep(i,first,last) for(int i=first;i<=last;i++)
 7 #define dep(i,first,last) for(int i=first;i>=last;i--)
 8 
 9 int a[maxn];
10 int bit(int x){
11     int ans=0;
12     if( x==0 ) return 1;
13     while(x){
14         ans++;
15         x/=10;
16     }
17     return ans;
18 }
19 bool cmp(int x, int y){ return x>y; }
20 
21 int main()
22 {
23     int n;
24     scanf("%d",&n);
25     ll ans=0;
26     rep(i,1,n){
27         scanf("%d",&a[i]);
28         ans-=(n-i)*bit(a[i]);
29     }
30     sort(a+1,a+1+n,cmp);
31     rep(i,1,n-1){
32         int l=i+1,r=n;
33         ll now=bit(a[i]);
34         while( l<=r ){
35             int mid=(l+r)>>1;
36             if( bit(a[i]+a[mid])>now ) l=mid+1;
37             else r=mid-1;
38         }
39         ans += (r-i)*(now+1)+(n-r)*now;
40     }
41     printf("%lld
",ans);
42     return 0;
43 }
原文地址:https://www.cnblogs.com/wsy107316/p/12334575.html