vijos 1056 图形面积

来源:互联网 发布:piffle总裁知世 编辑:程序博客网 时间:2024/04/29 14:43

vijos 1056 图形面积

题目链接:VIJOS 1056


题意:

桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

分析:

将n个矩形进行离散化出来,然后计算面积。


代码:

#include<cstdio> #include<algorithm>#include<iostream>using namespace std;int n,x[201],y[201],c[201][201];long long d[2][202],r=0;int find(int q,int f) {int l=1,r=2*n,m;while (l<=r) {m=(l+r)/2;if (d[f][m]>q) r=m-1; else if (d[f][m]<q) l=m+1; else break;} return m;}int main(){//freopen("read.txt","r",stdin);scanf("%d",&n);for (int i=1; i<=n ; i++) scanf("%d%d%d%d",&x[i],&y[i],&x[i+n],&y[i+n]);for (int i=1; i<=2*n; i++) {d[0][i]=x[i]; d[1][i]=y[i];}sort(d[0]+1,d[0]+1+2*n);sort(d[1]+1,d[1]+1+2*n);for (int i=1; i<=2*n; i++) x[i]=find(x[i],0);for (int i=1; i<=2*n; i++) y[i]=find(y[i],1);for (int z=1; z<=n ; z++) for (int i=x[z]+1; i<=x[z+n]; i++)for (int j=y[z]+1; j<=y[z+n]; j++) c[i][j]=1;long long r=0;for (int i=2; i<=2*n; i++)for (int j=2; j<=2*n; j++)if (c[i][j]) r+=(d[0][i]-d[0][i-1])*(d[1][j]-d[1][j-1]);printf("%I64d\n",r);return 0;}


1 0
原创粉丝点击