Codeforces Round #627 (Div. 3) D

题意:

有长为n的a,b两序列,问满足ai+aj>bi+bj(i<j)的i,j对数。

思路:

移项得:(ai-bi)+(aj-bj)>0,i<j即i!=j,用c序列保存所有ai-bi的值,排序,若左右数之和大于0,则右数与二数间的数之和都大于0,计入结果后移动右指针,否则移动左指针。

Tips:

c[i]+c[j]和ans可能会超范围

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
void solve(){
    int n;cin>>n;
    ll a[n],b[n];
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++) cin>>b[i];
    ll c[n];
    for(int i=0;i<n;i++) c[i]=a[i]-b[i];
    sort(c,c+n);
    ll l=0,r=n-1,ans=0;
    while(l<r){
        if(c[r]+c[l]>0) ans+=r-l,--r;
        else ++l;
    }
    cout<<ans<<endl;
}
 
int main(){
    solve();
    return 0;
}
原文地址:https://www.cnblogs.com/Kanoon/p/12484034.html