poj2785(折半枚举)

来源:互联网 发布:如何看懂棒球打击数据 编辑:程序博客网 时间:2024/05/16 08:44

题意:给定各有n个整数的四个数列A,B,C,D。要从每个数列中各一个数,是的四个数的和为0.求出这样的组合的个数。


解法:折半,枚举A,B数列的两两组合,然后排序,再枚举C,D的两两组个,在A,B的组合中二分查找匹配数的个数。复杂度n^2logn.


代码:

/***************************************************** author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <vector>#include <algorithm>#include <cmath>#include <map>#include <set>#include <stack>#include <string.h>using namespace std;#define eps 1e-8typedef long long LL;int num1[4100];int num2[4100];int num3[4100];int num4[4100];int tool[16100000];int p=0;int main(){    int n;    while(scanf("%d",&n)==1)    {        p=0;        for(int i=0; i<n; i++)            scanf("%d%d%d%d",num1+i,num2+i,num3+i,num4+i);        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)                tool[p++]=num1[i]+num2[j];        sort(tool,tool+p);        LL ans=0;        for(int i=0; i<n; i++)            for(int j=0; j<n; j++)            {                int t=-(num3[i]+num4[j]);                ans+=upper_bound(tool,tool+p,t)-lower_bound(tool,tool+p,t);            }        cout<<ans<<'\n';    }    return 0;}/*            */

0 0
原创粉丝点击