#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=2e5+10;
struct node {
int Left,Right,lazy;
double val;
}NODE[maxn<<2];
double pos[maxn];
void PushUp(int idx) {
if (NODE[idx].lazy) NODE[idx].val=pos[NODE[idx].Right]-pos[NODE[idx].Left-1];
else NODE[idx].val=NODE[idx<<1].val+NODE[idx<<1|1].val;
}
void Updata(int l, int r, int c, int idx) {
if (NODE[idx].Left==l&&NODE[idx].Right==r) {
NODE[idx].lazy+=c;
if (l==r) {
if (NODE[idx].lazy) NODE[idx].val=pos[r]-pos[l-1];
else NODE[idx].val=0;
} else PushUp(idx);
return;
}
int m=(NODE[idx].Left+NODE[idx].Right)>>1;
if (r<=m) Updata(l,r,c,idx<<1);
else if (l>m) Updata(l,r,c,idx<<1|1);
else {
Updata(l,m,c,idx<<1);
Updata(m+1,r,c,idx<<1|1);
}
PushUp(idx);
}
void build(int l, int r, int idx) {
NODE[idx].Left=l,NODE[idx].Right=r;
NODE[idx].val=NODE[idx].lazy=0;
if (l==r) return;
int m=(l+r)>>1;
build(l,m,idx<<1);
build(m+1,r,idx<<1|1);
}
struct edge {
double x1,x2,y;
int tem;
bool operator< (const edge& n) const {
return y<n.y;
}
}Edge[maxn<<2];
int main() {
int n,Case=0;
while (~scanf("%d",&n)&&n) {
if (Case) printf("\n");
int cnt=0,tot=0;
for (int i=0; i<n; ++i) {
double x1,y1,x2,y2;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
Edge[cnt++]={x1,x2,y1,1};
Edge[cnt++]={x1,x2,y2,-1};
pos[tot++]=x1,pos[tot++]=x2;
}
sort(pos,pos+tot);
tot=unique(pos,pos+tot)-pos;
build(1,tot,1);
sort(Edge,Edge+cnt);
double ans=0;
for (int i=0; i<cnt-1; ++i) {
int L=lower_bound(pos,pos+tot,Edge[i].x1)-pos+1;
int R=lower_bound(pos,pos+tot,Edge[i].x2)-pos;
// cout<<Edge[i].tem<<endl;
Updata(L,R,Edge[i].tem,1);
// cout<<NODE[1].val<<endl;
ans+=(NODE[1].val*(Edge[i+1].y-Edge[i].y));
}
printf("Test case #%d\nTotal explored area: %.2f\n",++Case,ans);
}
return 0;
}
场景一: POJ1151 参考代码C++
于 2022-03-27 23:31:35 首次发布