代码改变世界

1587. Eat or Be Eaten

2011-05-11 13:53  Min·zc  阅读(234)  评论(0编辑  收藏  举报

二分查找小于目标元素的最后一个元素的位置,注意每一组元素是不需要去重复的。

-------------------------------------------------------------------------------------------------------

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <memory.h>
 4 using namespace std;
 5 int A[20001];
 6 int B[20001];
 7 int cmp(const void* a, const void* b)
 8 {
 9         return *(int*)a-*(int*)b;
10 }
11 int bnr(int h,int r,int x)
12 {
13         int mid=(h+r)/2;
14         if(B[r-1]<x)
15                 return r;
16         else if(B[0]>=x)
17                 return 0;
18         while(h<=r)
19         {
20                 mid=(h+r)/2;
21 //              cout<<nb[mid]<<" "<<x<<endl;
22                 if(B[mid]>=x)
23                         r=mid-1;
24                 else
25                         h=mid+1;
26         }
27         return h;
28 }
29 int main()
30 {
31         int t;
32         cin>>t;
33         while(t--)
34         {
35                 memset(A,0,sizeof(A));
36                 memset(B,0,sizeof(B));
37                 int n,m;
38                 cin>>n>>m;
39                 for(int i=0;i<n;i++)
40                         cin>>A[i];
41                 for(int i=0;i<m;i++)
42                         cin>>B[i];
43                 qsort(A,n,sizeof(A[0]),cmp);
44                 qsort(B,m,sizeof(B[0]),cmp);
45                 int ans=0;
46                 for(int i=0;i<n;i++)
47                 {
48                         
49                         int tem=bnr(0,m,A[i]);
50         //             cout<<tem<<endl;
51                         ans+=tem;
52                 }
53                 cout<<ans<<endl;
54         }
55         
56 }