P5762 [NOI1997] 卫星覆盖

本文介绍了一个使用C++编写的程序,通过定义一系列函数和数据结构,处理输入的多边形面并计算它们在给定高度变化下的面积贡献,最后输出总和。
摘要由CSDN通过智能技术生成
#include <bits/stdc++.h>
#define re register int 
#define il inline
#define ll long long
#define x1 _
#define y1 __
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
using namespace std;
const int inf=1e9;
char buf[1<<23],*p1=buf,*p2=buf,obuf[1<<23],*O=obuf;
il int read(){
	char c=getchar();int z=0,f=1;
	while(c!='-'&&(c>'9'||c<'0')) c=getchar();
	if(c=='-') f=-1,c=getchar();
	while(c>='0'&&c<='9') z=(z<<1)+(z<<3)+c-'0',c=getchar();
	return z*f;
}
int f[2005][2005]; 
struct LINE{
	int x1,y1,x2,y2,mark,z;
}q[250];//x1,y1,x2,y2 维护面坐标,z维护高度 
bool cmp(LINE x,LINE y){
	return x.z<y.z;
}
int n,S,ans;
int main (){
	n=read();
	for(re i=1;i<=n;i++){
		int x=read()+1000,y=read()+1000,z=read()+1000,r=read();
		q[(i<<1)-1]={x-r+1,y-r+1,x+r,y+r,1,z-r};//插入队列 
		q[i<<1]={x-r+1,y-r+1,x+r,y+r,-1,z+r};
	}
	n<<=1;//便于操作 
	sort(q+1,q+1+n,cmp);
	for(re i=1;i<n;i++){//最后一个面不考虑 
		for(re j=q[i].x1;j<=q[i].x2;j++)
			for(re k=q[i].y1;k<=q[i].y2;k++){//无脑暴力修改 
				f[j][k]+=q[i].mark;
				if(q[i].mark==1&&f[j][k]==1) S++;
				if(q[i].mark==-1&&f[j][k]==0) S--;
			}
		ans+=(q[i+1].z-q[i].z)*S;
	}
	cout<<ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值