2020牛客寒假算法基础集训营6

D  重排列

思路:

upper_bound(a+1,a+1+n,b[i])-a-1记录的是在a[i]中第一个大于b[i]的地址,

lower_bound(a+1,a+1+n,b[i])-a-1记录的是在a[i]中第一个不小于b[i]的地址

内部的思想是二分

a   1    1     2     3

b   1    2     3     4

c   2    3     4     4

遍历b数组,当遍历到b[i]时,只用考虑a[i]有多少数可以使用,又因为1~i-1用了i-1个数,所以对于当前b[i]对应的a[i]数为c[i]-i+1。

这是需注意c[i]-i+1可能为负数,但答案不为负,所以有一个max的比较。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int maxn =1e5+10;
ll a[maxn],b[maxn],c[maxn];
ll ans;
int main(){
    ll n;
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
        scanf("%lld",&b[i]);
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    for(int i=1;i<=n;i++)
        c[i] = upper_bound(a+1,a+1+n,b[i])-a-1;
    ans = c[1];
    for(int i=2;i<=n;i++){
        ans = ans*max(c[i]-i+1,0ll)%mod;
    }
    cout<<ans<<endl;
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/lusiqi/p/12316299.html