poj2549是纯粹的K*sum问题。
代码链接:http://blog.csdn.net/u012915516/article/details/24047761
poj2785看上去也想是k*sum问题。
但是当我入手的时候,完全就是O(N^4)。无法达到要求。
也就是说K*sum问题只限于一个数组。
而折半枚举可以在多个数数组也可以在一个数组身上作用。
在一个数组上作用的题目:poj3977
poj2785代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[4010],b[4010],c[4010],d[4010],sum[4010*4010];
int main()
{
ll n,ans=0;
cin>>n;
for(int i=0;i<n;i++)
scanf("%lld %lld %lld %lld",&a[i],&b[i],&c[i],&d[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
sum[i*n+j]=c[i]+d[j];
sort(sum,sum+n*n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ans+=upper_bound(sum,sum+n*n,-a[i]-b[j])-lower_bound(sum,sum+n*n,-a[i]-b[j]);
printf("%lld\n",ans);
return 0;
}