首页 > 其他分享 >51NOD 1278 相离的圆(二分 + 排序 好题)

51NOD 1278 相离的圆(二分 + 排序 好题)

时间:2023-02-07 12:03:09浏览次数:46  
标签:1278 en 相离 51NOD 线段 好题 long pos int


平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。

例如:4个圆分别位于1, 2, 3, 4的位置,半径分别为1, 1, 2, 1,那么{1, 2}, {1, 3} {2, 3} {2, 4} {3, 4}这5对都有交点,只有{1, 4}是相离的。

 收起

输入


第1行:一个数N,表示圆的数量(1 <= N <= 50000) 第2 - N + 1行:每行2个数P, R中间用空格分隔,P表示圆心的位置,R表示圆的半径(1 <= P, R <= 10^9)


输出


输出共有多少对相离的圆。


输入样例


4 1 1 2 1 3 2 4 1


输出样例


1


 

分析:

一开始想到离散化+树状数组上去了,结果发现自己写错了。

回来先想到了排序,后来自然想到了二分(虽然有学长说这题是排序+二分的原因)

我们先把圆心和半径转化为线段的起始坐标,我们知道只要一条线段的右端点比某线段左端小,则这两条线段一定相离,所以我们先对右端点排序,枚举每一个左端点i,然后二分查找<i的个数即可。

 

#include<bits/stdc++.h>
using namespace std;


struct node
{
long long l,r;
}a[50005];
long long st[50005],en[50005];
bool cmp(node x,node y)
{
if(x.l==y.l)
return x.r<y.r;
else
return x.l<y.l;
}

int main()
{
int n;
while(~scanf("%d",&n))
{

long long pos,d;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&pos,&d);
a[i].l=pos-d;
a[i].r=pos+d;

}
//sort(a+1,a+n+1,cmp);
for(int i=0;i<n;i++)
{
st[i]=a[i+1].l;
en[i]=a[i+1].r;
//cout<<en[i]<<endl;
//cout<<a[i+1].l<<" "<<a[i+1].r<<endl;
}
sort(en,en+n);
long long ans=0;
for(int i=0;i<n;i++)
{
int temp=(lower_bound(en,en+n,st[i])-(en));
//cout<<st[i]<<" "<<temp<<endl;
ans+=temp;

}
printf("%lld\n",ans);

}
return 0;
}

 

标签:1278,en,相离,51NOD,线段,好题,long,pos,int
From: https://blog.51cto.com/u_14932227/6041853

相关文章

  • 51nod 2484 小b和排序(DP)
    小b有两个长度都为n的序列A,B。现在她需要选择一些i,然后交换A[i]和B[i],使得A和B都变成严格递增的序列。你能帮小b求出最少交换次数吗?输入保证有解。 收起输入第一行输入一......
  • 51nod 1428活动安排问题
    有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?  收起输入第一行一个正整数n(n<=10000)代表活动......
  • 51nod 1138 连续整数的和 好题
    给出一个正整数N,将N写为若干个连续数字和的形式(长度>=2)。例如N=15,可以写为1+2+3+4+5,也可以写为4+5+6,或7+8。如果不能写为若干个连续整数的和,则输出NoS......
  • 51nod 1095 Anigram单词
    1095Anigram单词一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。另:相同的2个单词不算Anigram。现在给定......
  • 51nod 1133 不重叠的线段
    X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。例如:[15][23][36],可以选[23][36],这2条线段互不重叠。 收......
  • 51Nod 1050 循环数组最大子段和
    N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的......
  • 超级无敌神仙炫酷无敌原神大王好题。
    都是神题,难度3000上下。有些都是看题解做的,就当涨知识见世面了。学OI没做这些题,简直就是打游戏不玩原神,看vtb不看東雪蓮,听歌不听曹万江,成功学不学cjx,看闲话不看韩神,只......
  • 差分约束好题
    1、MagicProblem-7176(hdu.edu.cn)思路:求的是区间总和,所以考虑和前缀和进行结合,将前缀和a[i](前i个数的前缀和)作为边权。然后考虑限制条件。首先,区间[l,r]的总和小于......
  • 小型取暖器和暖风机在亚马逊需提交UL1278测试报告
    小型取暖器如果您在亚马逊商城发布商品,则必须遵守适用于这些商品和商品信息的所有联邦、州和地方法律以及亚马逊政策(包括本政策)。本政策涵盖的小型取暖器便携式小型取暖器是......
  • P2657 [SCOI2009] windy 数 数位DP好题
    P2657[SCOI2009]windy数-洛谷|计算机科学教育新生态(luogu.com.cn)数位DP好题主要问题是:不含前导零且相邻两个数字之差至少为 2solution:现在枚举到了第i位......