Description
Input
Output
Sample Input
6 -45 22 42 -16 -41 -27 56 30 -36 53 -37 77 -36 30 -75 -46 26 -38 -10 62 -32 -54 -6 45
Sample Output
5
Hint
Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46),(-32, 30, -75, 77), (-32, -54, 56, 30).
这道题我是使用了二分查找的方式;
开始抽了,忘记了多解情况,用了STL;
#include<iostream> #include<cstdlib> #include<string> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<stack> #include<queue> #include<iomanip> using namespace std; int sum1[16100000],sum2[16100000]; int binary(int left,int right,int k,int t) { int i; while(left<=right) { int mid=(left+right)/2; int num=0; if(sum2[mid]==k) { num=1; for(i=mid-1;i>=0&&sum2[i]==k;--i) ++num; for(i=mid+1;i<t&&sum2[i]==k;++i) ++num; return num; } else if(sum2[mid]>k) right=mid-1; else left=mid+1; } return 0; } int main() { int n,s[5000][4]; scanf("%d",&n); for(int i=0;i<n;++i) for(int j=0;j<=3;++j) { scanf(" %d",&s[i][j]); } int t=0; for(int i=0;i<n;++i) for(int j=0;j<n;++j) { sum1[t]=s[i][0]+s[j][1]; sum2[t++]=-(s[i][2]+s[j][3]); } sort(sum2,sum2+t); int ans=0; for(int i=0;i<t;++i) { ans+=binary(0,t,sum1[i],t); } printf("%d\n",ans); return 0; }