场景一: POJ1151 参考代码C++

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值