const int N = 100; //矩形的最大个数
typedef double typev;
struct seg{
int l, r;
int c; //覆盖数
typev m; //覆盖长度
}segs[N<<3];
struct li{
typev x, ly, hy; //ly为小的,hy为大的
void set(typev x, typev ly, typev hy){
this->x = x, this->ly = ly, this->hy = hy;
}
bool is_l; //标记是否是左边的线段
}lis[N*2];
//左下角是(x1,y1),右上角是(x2,y2), x1<x2,y1<y2的矩形
struct rect{
typev x1, x2, y1, y2;
void read(){
scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
}
}rs[N<<1];
typev y[N<<1];
int n, cnt;
bool cmp(li l1, li l2){
return l1.x < l2.x;
}
void build(int id, int l, int r){
segs[id].l = l, segs[id].r = r, segs[id].m = segs[id].c = 0;
if(l < r - 1){
int mid = (l+r)>>1;
build(2*id+1, l, mid);
build(2*id+2, mid, r);
}
}
int binary(int l, int r, typev k){
int mid;
while(l <= r){
mid = (l+r)>>1;
if(y[mid] >= k) r = mid-1;
else l = mid+1;
}
return r+1;
}
void renew(int id){
if(segs[id].c > 0) segs[id].m = y[segs[id].r] - y[segs[id].l];
else if(segs[id].l == segs[id].r - 1) segs[id].m = 0;
else{
segs[id].m = segs[2*id+1].m + segs[2*id+2].m;
}
}
// 可以把insert和del合为一个函数
void modify(int id, int l, int r, int k){
if(segs[id].l >= l && segs[id].r <= r){
segs[id].c += k;
renew(id);
}else if(segs[id].l < segs[id].r - 1){
int mid = (segs[id].l + segs[id].r)>>1;
if(l < mid) modify(2*id+1, l, r, k);
if(r > mid) modify(2*id+2, l, r, k);
renew(id);
}
}
//n个矩形的面积并
typev unionArea(rect* rs, int n){
int i;
typev x1, y1, x2, y2, py1, py2, area;
for(i = 0; i < n; i++){
x1 = rs[i].x1; y1 = rs[i].y1;
x2 = rs[i].x2; y2 = rs[i].y2;
lis[2*i].set(x1, y1, y2);
lis[2*i].is_l = true;
lis[2*i+1].set(x2, y1, y2);
y[2*i] = y1;
y[2*i+1] = y2;
lis[2*i+1].is_l = false;
}
n <<= 1;
sort(y, y + n);
sort(lis, lis+n, cmp);
cnt = unique(y, y + n) - y;
build(0, 0, cnt-1);
area = 0;
for(i = 0; i < n-1; i++){
py1 = binary(0, cnt-1, lis[i].ly);
py2 = binary(0, cnt-1, lis[i].hy);
if(lis[i].is_l) modify(0, py1, py2, 1);
else modify(0, py1, py2, -1);
area += (lis[i+1].x - lis[i].x) * (segs[0].m);
}
return area;
}
分享到:
相关推荐
ACM中对于矩形面积并用线段树+离散化+ 扫描线一类问题求解
C#计算长方形面积C#计算长方形面积C#计算长方形面积
简单C++ 计算矩形面积,只有一个类,和一个方法。
C++计算矩形的面积
利用坐标求矩形面积,希望要下载的朋友也应该考虑一下它的实用性
C++计算矩形面积.。
编写jsp页面实现如下界面效果,然后交给servlet计算矩形的周长和面积,并输出结果。
定义一个矩形,通过长度和宽度来求解出它的面积
如题,c++实现圆面积,圆周长以及长方形面积,长方形周长的计算。同理,可用于计算三角形等其它图形。
用接口设计并实现面积与周长计算 要求:①定义一个接口,其中包含一个计算面积的抽象方法和一个计算周长的抽象方法;②输入数据为圆的半径、三角形...④计算圆、三角形、矩形的面积和周长,并输出原始数据和结算结果。
9715 相邻最大矩形面积
给定已知的圆的半径,矩形的长和宽,分别求它们的面积和周长
利用 python 计算矩形框面积的交并比,利用 python 简单计算矩形框面积的交并比,
输入左上角和右下角的坐标,计算出矩形的面积
实现利用Rectangle输出一个矩形的周长和面积
1、 矩形 编写C++程序完成以下功能: (1) 定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法; (2) 定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积...(5) 计算其面积,并输出。
这是一个长方形表面积和体积的程序,是我作为初学者做的
矩形面积计算,c++实现,rectangle的大小
在X轴上水平放置着N个条形图,这N个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同
输入矩形长宽,计算边长和面积并打印矩形的c++程序