xdoj 1068 两组数相乘第k大

把相乘列成矩阵,首先想到可以二分答案,然后根据答案再二分出每行的位置。但是这样是这样对大数据有压力。然后因为答案在矩阵中的位置是单调的,所以扫一次即可,O(nlogn)。

  1. /*
  2. Author: fffasttime
  3. Date: 
  4. */
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. typedef long long ll;
  8. #define inc(i,n) for (int i=0;i<n;i++)
  9. const int N=100010;
  10.  
  11. ll a[N],b[N];
  12.  
  13. int n,m,k;
  14.  
  15. bool check(ll s){
  16. 	int r=m-1,sum=0;;
  17. 	for (int i=0;i<n;i++){
  18. 		for (;r>=0 && a[i]*b[r]<=s;r--);
  19. 		sum+=r+1;
  20. 	}
  21. 	return sum<k;
  22. }
  23.  
  24. int main(){
  25. 	int T; cin>>T;
  26. 	while (T--){
  27. 		cin>>n>>m>>k;
  28. 		inc(i,n) scanf("%lld",a+i);
  29. 		inc(i,m) scanf("%lld",b+i);
  30. 		sort(a,a+n,greater<ll>()); sort(b,b+m,greater<ll>());
  31. 		ll l=0,r=1e11;
  32. 		while (l<r){
  33. 			ll mid=l+r>>1;
  34. 			if (check(mid)) r=mid;
  35. 			else l=mid+1;
  36. 		}
  37. 		printf("%lld\n",r);
  38. 	}
  39. 	return 0;
  40. }

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注