1 solutions

  • 1
    @ 2025-11-6 16:39:34

    首先想到直接四层枚举时间复杂度为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