【折半枚举】(双向搜索)

Posted on 2018-05-14 21:07  som_nico  阅读(785)  评论(0编辑  收藏  举报

折半枚举是一种很好用的枚举方法,比如有时集合过大无法全部搜索,但刚好只需要他们的和或其他可以处理出的东西,就可以一半一半搜

 

4 Values whose Sum is 0


题意:a+b+c+d=0 的个数 
思路:a+b=-(c+d) 
   只与和有关,所以先把 c+d 的和预处理并排序,当 a+b 值一定时,显然 c+d 值也一定,所以只要二分出 
   满足c+d=-(a+b) 的 c+d 的个数即可 

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int a[4040];int b[4040];int ab[8080];
    int c[4040];int d[4040];
    int n;
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++)
            cin>>b[i];
        for(int i=0;i<n;i++)
            cin>>c[i];
        for(int i=0;i<n;i++)
            cin>>d[i];
        int count1=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                ab[count1++]=a[i]+b[j];
          sort(ab,ab+n*n);
          int res=0;
          for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
              {
                  int cd=-(c[i]+d[j]);
                  res+=upper_bound(ab,ab+n*n,cd)-lower_bound(ab,ab+n*n,cd);
              }
              cout<<res<<endl;
    }
}

 

 

Difference(折半枚举,二分)

我的另一篇随笔有详解:点这儿