4 Values whose Sum is 0 POJ 2785

很有意思的一道題,四個數組可以先加兩個,另外兩個再來找相加等於前面相加的,把n4方的複雜度降到了n2方logn

#include<iostream>
#include<algorithm>

using namespace std;

const int MAXN=4050;

int a[MAXN],b[MAXN],c[MAXN],d[MAXN];
int ab[MAXN*MAXN];
int sum;

int main()
{
	int n;
	cin>>n;
	int ans=0;
	for(int i=0;i<n;i++)
		cin>>a[i]>>b[i]>>c[i]>>d[i];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			ab[n*i+j]=a[i]+b[j];
		}
	}
	sort(ab,ab+n*n);
	for(int i=0;i<n*n;i++)
		cout<<ab[i]<<" ";
	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			sum=-(c[i]+d[j]);
			ans+=upper_bound(ab,ab+n*n,sum)-lower_bound(ab,ab+n*n,sum);
            //在ab中要是沒有sum這個數的話,lower和upper都找不到是0,有重複的可以直接加起不需要下次再看
		}
	}
	cout<<ans<<endl;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章