POJ 2785(二分&三分_C题)解题报告
题目链接:http://poj.org/problem?id=2785
--------------------------------------------------------
题意:四组值,问能够加和为0的组数。
思路:首先A、B加和得到新数组,C、D加和得到新数组。二分查找。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN = 4010; ll a[MAXN]; ll b[MAXN]; ll c[MAXN]; ll d[MAXN]; ll ab[MAXN*MAXN]; ll cd[MAXN*MAXN]; int main(void){ int n=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%lld %lld %lld %lld",&a[i],&b[i],&c[i],&d[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ ab[i*n+j]=a[i]+b[j]; cd[i*n+j]=c[i]+d[j]; } } sort(cd,cd+n*n); ll count =0; for(int i=0;i<n*n;i++){ count+=upper_bound(cd,cd+n*n,-ab[i])-lower_bound(cd,cd+n*n,-ab[i]); } printf("%lld\n",count); return 0; }

浙公网安备 33010602011771号