例题8-3:和为0的4个值(中途相遇法)

来源:互联网 发布:淘宝秒杀助手mac 编辑:程序博客网 时间:2024/06/05 03:13

例题8-3:和为0的4个值
用中途相遇法的思想来解题。分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度。
这里用到一个很实用的技巧:
  求长度为n的有序数组a中的数k的个数num?
    num=upper_bound(a,a+n,k)-lower_bound(a,a+n,k);

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<string>#include<cmath>#include<set>#include<queue>#include<map>#include<stack>#include<vector>#include<list>#include<deque>using namespace std;typedef long long ll;const int maxn = 1e6 + 10;const double eps = 1e-6;const int INF = 1 << 30;int T, n, m;int a[4005], b[4005], c[4005], d[4005];int ab[16001000], cd[16001000];int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        for(int i = 0; i < n; i++)        {            scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);        }        int tot = 0, ans = 0;        for(int i = 0; i < n; i++)        {            for(int j = 0; j < n; j++)            {                ab[tot] = a[i] + b[j];                cd[tot++] = c[i] + d[j];            }        }        sort(ab, ab + tot);        for(int i = 0; i < tot; i++)            ans += upper_bound(ab, ab + tot, -cd[i]) - lower_bound(ab, ab + tot, -cd[i]);        cout<<ans<<endl;        if(T)cout<<endl;    }    return 0;}
阅读全文
0 0
原创粉丝点击