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