题解:P11201 [JOIG 2024 Open] たくさんの数字 / Many Digits
除了搬题人之外的首 A,来纪念一下。
Solution P11201
Idea
我们先对 数组排序,然后枚举 数组。
不难发现:对于 ,假如最后写出的数有 位,则一定有 。
不难发现对于每一个 对应的都是一个连续区间,于是可以二分。
具体实现起来,可以用 lower_bound 快速解决。
讲一下下面代码里的 lpos 和 now 为什么可行:你会发现对于 的情况,两个要求分别是 及 。代入 可得第一个式子是 。两个式子一综合,这个显然就可行了。
Code
#include<bits/stdc++.h>
using namespace std;
const int N=150005;
int n,a[N],b[N];
const int mi10[10]={0,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
long long ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
sort(b+1,b+n+1);
for(int i=1,lpos,now;i<=n;i++){
lpos=n+1;
for(int j=9;j>=0;j--){
now=lower_bound(b+1,b+n+1,mi10[j]-a[i])-b;
ans=ans+1ll*(lpos-now)*(j+1);
lpos=now;
}
}
printf("%lld",ans);
return 0;
}

浙公网安备 33010602011771号