原题目链接
首先想到$\Theta(n^4)$的暴力枚举,但$n\le 4000$显然不行。
考虑先预处理出c数组和d数组的和,再暴力计算答案。
由于c数组和d数组的和可能会有重复,排序后使用二分来降低时间复杂度
最终时间复杂度$\Theta (n^2\log n)$
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<cstdio> #include<algorithm> using namespace std; const int N=4010; int n,nn,a[N],b[N],c[N],d[N],sum[N*N],ans=0; inline void read(int &x) { char ch=getchar(); int f=1; x=0; while(!('0'<=ch&&ch<='9')) { if(ch=='-') f=-1; ch=getchar(); } do { x=(x<<3)+(x<<1)+ch-48; ch=getchar(); }while('0'<=ch&&ch<='9'); x*=f; } inline int calc(int x,int y) { return (x-1)*n+y; } int main() { read(n); nn=n*n; for(int i=1;i<=n;++i) read(a[i]),read(b[i]),read(c[i]),read(d[i]); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) { sum[calc(i,j)]=c[i]+d[j]; } sort(sum+1,sum+nn+1); for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { ans+=upper_bound(sum+1,sum+nn+1,-a[i]-b[j])-lower_bound(sum+1,sum+nn+1,-a[i]-b[j]); } } printf("%d",ans); return 0; }
|