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 / 思维 二分的主要内容,如果未能解决你的问题,请参考以下文章

D - Pair of Topics

二分Pair of Topics

Codeforces - 1324D - Pair of Topics(尺取)

[Codeforces] 1324-D Pair of Topics

Educational Codeforces Round 41 D. Pair Of Lines

D. Pair of Numbers (ST表&二分&双指针)