折半枚举是一种很好用的枚举方法,比如有时集合过大无法全部搜索,但刚好只需要他们的和或其他可以处理出的东西,就可以一半一半搜
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(折半枚举,二分)
我的另一篇随笔有详解:点这儿