[POJ] 2785 4 Values whose Sum is 0(双向搜索)
题目地址:http://poj.org/problem?id=2785
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<time.h> 8 #include<stdlib.h> 9 #include<set> 10 #include<map> 11 #include<stack> 12 #include<queue> 13 #include<vector> 14 using namespace std; 15 #define clr(x,y) memset(x,y,sizeof(x)) 16 #define sqr(x) ((x)*(x)) 17 #define rep(i,a,b) for(int i=(a);i<=(b);i++) 18 #define LL long long 19 #define INF 0x3f3f3f3f 20 #define A first 21 #define B second 22 23 const int N=4000+131; 24 int n,a[5][N],b[N*N]; 25 26 void solve() 27 { 28 scanf("%d",&n); 29 for(int i=0;i<n;i++) { 30 for(int j=0;j<4;j++) { 31 scanf("%d",&a[j][i]); 32 } 33 } 34 35 for(int i=0;i<n;i++) { 36 for(int j=0;j<n;j++) { 37 b[i*n+j]=a[0][i]+a[1][j]; 38 } 39 } 40 sort(b,b+n*n); 41 LL res=0; 42 for(int i=0;i<n;i++) { 43 for(int j=0;j<n;j++) { 44 int p=-(a[2][i]+a[3][j]); 45 res+=upper_bound(b,b+n*n,p)-lower_bound(b,b+n*n,p); 46 } 47 } 48 49 printf("%lld\n",res); 50 51 } 52 int main() 53 { 54 solve(); 55 56 return 0; 57 }