hdu 1895(二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1895

思路:

就是先两两合并,然后排序一下二分就可以了,最后要注意的地方就是二分找到解得时候,还要看一下相邻的数是否与解相等(因为可能有多个这样的数)

Ps:郁闷死了,一开始用的是long long ,然后wa到死,结果改成int就过了,而且那个1000000007也没有用,orz...

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cmath>

 5 #include<algorithm>

 6 using namespace std;

 7 #define MAXN 333

 8 int num[6][MAXN];

 9 int Ha[MAXN*MAXN],Hb[MAXN*MAXN],Hc[MAXN];

10 int n1,n2,n3,n4,n5,h1,h2,h3;

11 int ans;

12 

13 int Binary_Search(int l,int h,int x){

14     while(l<=h){

15         int mid=(l+h)/2;

16         if(Hb[mid]==x){

17             int sum=1;

18             for(int i=mid-1;i>=1&&Hb[i]==x;i--)sum++;

19             for(int i=mid+1;i<=h2&&Hb[i]==x;i++)sum++;

20             return sum;

21         }else if(Hb[mid]<x){

22             l=mid+1;

23         }else 

24             h=mid-1;

25     }

26     return 0;

27 }

28 

29 

30 void Solve(){

31     ans=h1=h2=h3=0;

32     for(int i=1;i<=n5;i++)Hc[++h3]=num[5][i];

33     for(int i=1;i<=n1;i++)

34         for(int j=1;j<=n2;j++)

35             Ha[++h1]=num[1][i]+num[2][j];

36     for(int i=1;i<=n3;i++)

37         for(int j=1;j<=n4;j++)

38             Hb[++h2]=num[3][i]+num[4][j];

39     sort(Ha+1,Ha+h1+1);

40     sort(Hb+1,Hb+h2+1);

41     sort(Hc+1,Hc+h3+1);

42     for(int i=1;i<=h3;i++){

43         for(int j=1;j<=h1;j++){

44             int x=-(Hc[i]+Ha[j]);

45             ans+=Binary_Search(1,h2,x);

46         }

47     }

48     printf("%d\n",ans);

49 }

50 

51 

52 int main(){

53     int _case;

54     scanf("%d",&_case);

55     while(_case--){

56         scanf("%d",&n1);

57         for(int i=1;i<=n1;i++)scanf("%d",&num[1][i]);

58         scanf("%d",&n2);

59         for(int i=1;i<=n2;i++)scanf("%d",&num[2][i]);

60         scanf("%d",&n3);

61         for(int i=1;i<=n3;i++)scanf("%d",&num[3][i]);

62         scanf("%d",&n4);

63         for(int i=1;i<=n4;i++)scanf("%d",&num[4][i]);

64         scanf("%d",&n5);

65         for(int i=1;i<=n5;i++)scanf("%d",&num[5][i]);

66         Solve();

67     }

68     return 0;

69 }
View Code

 

你可能感兴趣的:(HDU)