Codeforces Round #627 (Div. 3) D - Pair of Topics(双指针)

题意:

有长为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;
}

 

posted @ 2020-03-13 01:01  Kanoon  阅读(162)  评论(0编辑  收藏  举报