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;
} 

 

posted @ 2020-02-16 12:19  sqsq  阅读(102)  评论(0编辑  收藏  举报