题目: POJ 2785 4 Values whose Sum is 0 ,哈哈,我们今天来看一道稍微简单的二分题嘛,这是选自POJ上的一道题,好了,我们一起来看看题意吧:
考虑到直接复制题目,或者截屏的方式不是很方便阅读,我就把直接题目链接放下面!
题目传送门: POJ 2785 4 Values whose Sum is 0
思路
:
这道题你要是写个4重循环那可就太惨了,其实可以是2重循环的,我们计算前两列的分别两两相加的和,用b数组装,然后计算后两列的分别两两相加的和,用c数组装,我们只需要计算在c数组中有多少与b数组构成相反数,具体的直接看代码吧!
我们来看看成功AC的代码吧:
#include<iostream> #include<algorithm> using namespace std; #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) typedef long long ll; const int N=4010; int a[N][6]; int n; ll b[N*N],c[N*N]; ll ans; int main(){ ios; cin>>n; for(int i=1;i<=n;i++) cin>>a[i][1]>>a[i][2]>>a[i][3]>>a[i][4]; ll cnt=0; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ b[++cnt]=a[i][1]+a[j][2]; c[cnt]=a[i][3]+a[j][4]; } sort(c+1,c+1+cnt);//记住给c数组排序 for(int i=1;i<=cnt;i++){ ans+=upper_bound(c+1,c+1+cnt,-b[i])-lower_bound(c+1,c+1+cnt,-b[i]); } cout<<ans<<"\n"; return 0; }