E题题解

(最简方法,运行最快,不需要特判,不需要算法,只有一个for循环!)

首先 取数发现可以遍历 ++ 所有数,

++,问题转化为在 取一个数。

举例一个

  1. 贪心考虑从高位往低位看,如果 对应数位值相等,没有办法,只能取这个值,现在

  2. 一直到不等的地方,例子中百位 ,如果我们的 百位为 ,那么最后三位数最大位数和为 ++;但如果退一步选 ,那么最后三位数最大位数和为 ++。观察琢磨发现,在 不等的地方,将 数位降 ,后面的数位全选

  3. 发现 这样的临界值我们取不到,之前我们的 总会小于 ,那么不妨让 加上一个 完美解决问题。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll T=1,l1,r1,l2,r2,l,r,ans;
void solve(){
    cin>>l1>>r1>>l2>>r2;ans=0;
    l=l1+l2,r=r1+r2+1;
    for(ll i=18,j=1000000000000000000;i>=0;i--,l%=j,r%=j,j/=10)//从第18位计算
        if(l/j==r/j) ans+=r/j;
        else{
            ans+=r/j-1+9*i;
            break;
        }
    cout<<ans;puts("");
}int main(){cin>>T;while(T--) solve();}