hdu 5862 Counting Intersections 坐标离散化+树状数组

题目大意:给你与坐标轴平行的线段,问相交点有多少。

我们将与x轴平行的线段分成两个点,左端点与右端点,与y坐标平行的线段取它的x坐标作为一个点,排序。那么一遍扫过去,遇到左端点,对应的y坐标++,遇到右端点对应的y坐标--,遇到第三种点,就是统计当前这个点对应y1,y2坐标之间出现过多少点。支持单点修改,区间求和,线段树树状数组都可以高效求解。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn=1e5+10;

struct point{
	int x,y,yy,type;
	bool operator<(point t)const {
		if(x==t.x)return type0){
		ans+=bit[i];
		i-=i&-i;
	}
	return ans;
}
void add(int i,int x){
	while(ix2)swap(x1,x2);
				a[siz++]=point{x1,y1,0,-1};
				a[siz++]=point{x2,y1,0,1};
			}
			else{
				if(y1>y2)swap(y1,y2);
				a[siz++]=point{x1,y1,y2,0};
			}
		}
		sort(a,a+siz);
		long long ans=0;
		for(int i=0;i


你可能感兴趣的:(树状数组)