1 solutions
-
1
首先想到直接四层枚举时间复杂度为O(n^4),超时,如果只对最后一层的遍历改成二分查找,时间复杂度为O(n^3logn),也会超时,,所以我们用下面方法
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1005; int a[N],b[N],c[N],d[N]; int ab[N*N],cd[N*N]; int main(){ int n; cin >> n; for(int i=0;i<n;i++){ cin >> a[i] >> b[i] >> c[i] >> d[i]; } int t=0; //我们先把ab和cd进行所有的组合 for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ ab[t]=a[i]+b[j]; cd[t++]=c[i]+d[j]; } } sort(cd,cd+t);//对cd进行排序即可,方便后续进行二分 ll cnt=0; for(int i=0;i<t;i++){ cnt+=(upper_bound(cd,cd+t,-ab[i])-cd)-(lower_bound(cd,cd+t,-ab[i])-cd); } cout << cnt; return 0; }
- 1
Information
- ID
- 7087
- Time
- 2000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 22
- Accepted
- 4
- Uploaded By