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 }