题面大概如此,之前作业布置用红黑树做,做了很久(还是借鉴了别人的),后面又学了线段树和树状数组,就想用红黑树做的大致思路试试线段树能不能做,最后做出来效率和我用红黑树做的差不多,就发出来记录一下。
思路大致是给弦的两个端点排名,再利用线段树维护求出相交弦的条数,例如两条弦满足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{