线段树求解圆上相交弦(EOJ)

本文介绍了如何运用线段树来解决圆上相交弦的问题。通过给弦的端点排名,利用线段树维护相交弦的数量。首先,根据端点排名构建线段树,然后插入和删除操作更新线段树,并查询特定区间内相交弦的数目。最终,通过线段树实现的解决方案与红黑树效率相当。
摘要由CSDN通过智能技术生成

题面大概如此,之前作业布置用红黑树做,做了很久(还是借鉴了别人的),后面又学了线段树和树状数组,就想用红黑树做的大致思路试试线段树能不能做,最后做出来效率和我用红黑树做的差不多,就发出来记录一下。

思路大致是给弦的两个端点排名,再利用线段树维护求出相交弦的条数,例如两条弦满足a.left<b.left<a.right<b.right,这样是相交的情况,a的左端点排名为1,右端点排名为3,b的左端点排名为2,夹在1与3之间,用线段树做的话就是求出这一条弦左右端点排名之间所含的左端点的个数,所以就是求出一段区间的值。

排名的方法我是开了输入数据组数的两倍的数组,分别用来记录左右端点(同时也要记录另一个端点的值),又开了另一个数组b用来求点的排名。

用线段树的思路挺简单的,判断是左端点就插入到对应排名的区间里,例如[1,1]。同时将沿途经过的所有区间都记录一次插入左端点。是右端点的话,先将对应左端点的所在区间的值删除,然后求出这两个区间中间所夹区间记录的左端点数。

表述可能比较乱,代码如下:

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

struct line{
    double x0;double x1;int num1;int num2;int flag;
};
struct tree{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值