D. Pair of Topics1400 / 思维 二分
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Pair of Topics1400 / 思维 二分相关的知识,希望对你有一定的参考价值。
https://codeforces.com/problemset/problem/1324/D
我们直接将c数组构造出来,然后从小到大排序。默认ci>cj 避免重复计算
然后对于每一个我们只要从后面找到满足条件的最小下标即可。然后加上那一段的个数。
你可能会好奇,排序后的顺序不是会打乱原来的顺序么?其实是我所谓的。
因为我们构造的数组既然有 ci>cj i>j 必然会有其相反所对应的,故无所谓了。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*3+10;
long long int a[N],b[N],c[N],n,ans;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) c[i]=a[i]-b[i];
sort(c+1,c+n+1);
for(int i=1;i<=n;i++)
{
int l=i+1,r=n;
int x=-c[i];
while(l<=r)//二分找到严格大于x的第一个下标
{
int mid=l+r>>1;
if(c[mid]>x) r=mid-1;
else l=mid+1;
}
ans+=n-l+1;
//int cnt = upper_bound(c+i+1,c+n+1,-c[i]) - c;
//ans+=n-cnt+1;
}
cout<<ans<<endl;
return 0;
}
以上是关于D. Pair of Topics1400 / 思维 二分的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces - 1324D - Pair of Topics(尺取)
[Codeforces] 1324-D Pair of Topics