题意:

       给你n个矩形,每个矩形上都有一个矩形的空洞,所有的矩形都是平行于x,y轴的,最后问所有矩形的覆盖面积是多少。

思路:

      是典型的矩形覆盖问题,只不过每个矩形上多了一个矩形洞,我的做法是吧当前的矩形分成四个小的矩形,然后用线段树的扫描线扫一遍就ok了,记得要用INT64 ,自己没注意这个问题wa了一次。


#include<stdio.h>
#include<string.h>
#include<algorithm> #define N 300000
#define lson l ,mid ,t << 1
#define rson mid ,r ,t << 1 | 1

using namespace
std; typedef struct
{
__int64
l ,r ,h ,mk;
}
EDGE; __int64 len[N] ,cnt[N];
EDGE edge[N*2]; bool camp(EDGE a ,EDGE b)
{
return
a.h < b.h || a.h == b.h && a.mk > b.mk;
} void
Pushup(__int64 l ,__int64 r ,__int64 t)
{
if(
cnt[t]) len[t] = r - l;
else if(
l + 1 == r) len[t] = 0;
else
len[t] = len[t<<1] + len[t<<1|1];
} void
Update(__int64 l ,__int64 r ,__int64 t ,__int64 a ,__int64 b ,__int64 c)
{

//printf("%d %d %d\n" ,l ,r ,t);
if(l == a && r == b)
{

cnt[t] += c;
Pushup(l ,r ,t);
return;
}
__int64
mid = (l + r) >> 1;
if(
b <= mid) Update(lson ,a ,b ,c);
else if(
a >= mid) Update(rson ,a ,b ,c);
else
{

Update(lson ,a ,mid ,c);
Update(rson ,mid ,b ,c);
}

Pushup(l ,r ,t);
} __int64
abss(__int64 x)
{
return
x < 0 ? -x : x;
} int main ()
{
__int64
i ,j ,n ,x1 ,x2 ,x3 ,x4 ,y1 ,y2 ,y3 ,y4 ,id;
__int64
xx1 ,xx2 ,yy1 ,yy2;
while(~
scanf("%I64d" ,&n) && n)
{
for(
id = 0 ,i = 1 ;i <= n ;i ++)
{

scanf("%I64d %I64d %I64d %I64d %I64d %I64d %I64d %I64d" ,&x1 ,&y1 ,&x2 ,&y2 ,&x3 ,&y3 ,&x4 ,&y4);
x1 ++ ,y1 ++ ,x2 ++ ,y2 ++ ,x3 ++ ,y3 ++ ,x4 ++ ,y4 ++;
// x1 y2 x2 y4
xx1 = x1 ,xx2 = x2 ,yy1 = y2 ,yy2 = y4;
if(
abss(xx1 - xx2) && abss(yy1 - yy2))
{

edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1; edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;
}

// x1 y3 x2 y1
xx1 = x1 ,xx2 = x2 ,yy1 = y3 ,yy2 = y1;
if(
abss(xx1 - xx2) && abss(yy1 - yy2))
{

edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1; edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;
}
// x1 y4 x3 y3
xx1 = x1 ,xx2 = x3 ,yy1 = y4 ,yy2 = y3;
if(
abss(xx1 - xx2) && abss(yy1 - yy2))
{

edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1; edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;
}
// x4 y4 x2 y3
xx1 = x4 ,xx2 = x2 ,yy1 = y4 ,yy2 = y3;
if(
abss(xx1 - xx2) && abss(yy1 - yy2))
{

edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy1 ,edge[id].mk = 1; edge[++id].l = xx1;
edge[id].r = xx2 ,edge[id].h = yy2 ,edge[id].mk = -1;
}
}

sort(edge + 1 ,edge + id + 1 ,camp);
__int64
Ans = 0;
memset(len ,0 ,sizeof(len));
memset(cnt ,0 ,sizeof(cnt));
edge[0].h = edge[1].h;
for(
i = 1 ;i <= id ;i ++)
{

Ans += len[1] * (edge[i].h - edge[i-1].h);
Update(1 ,50001,1 ,edge[i].l ,edge[i].r ,edge[i].mk); }
printf("%I64d\n" ,Ans);
}
return
0;
}

     

最新文章

  1. mongodb
  2. Gerald is into Art
  3. SQL Server 查询、搜索命令、语句
  4. C++ | boost库 类的序列化
  5. c++中new和delete的使用方法
  6. Datum Form Goole Android
  7. Node.js连接数据库
  8. 完整的RecylerView的使用方法和例子
  9. HDU 3336 Count the string KMP
  10. java 不寻常的问题 No bean named &amp;#39;sessionFactory&amp;#39; is defined 和 initialize a collection of role
  11. log4cxx入门第一篇--一个小例子
  12. Pop框架简述
  13. javascript中 __proto__与prorotype的理解
  14. Java基础之入门
  15. Android短信备份及插入笔记
  16. SVN删除文件和恢复文件
  17. web爬虫,requests请求
  18. WMS程序部署
  19. HTML基础【4】:表格标签
  20. PC/FORTH 数字类型

热门文章

  1. 剑指 Offer 65. 不用加减乘除做加法 + 位运算
  2. PAT-1099(Build A Binary Search Tree)Java实现+二叉排序树的中序遍历和层次遍历
  3. POJ-2406(KMP+字符串压缩)
  4. 数据库事务 ACID属性、数据库并发问题和四种隔离级别
  5. Oracle数据库搬家牵扯出的一些知识点记录
  6. 2018.8.30 nowcoder oi赛制测试1
  7. Hi3559AV100 NNIE开发(5)mobilefacenet.wk仿真成功量化及与CNN_convert_bin_and_print_featuremap.py输出中间层数据对比过程
  8. HDU_6695 Welcome Party 【思维】
  9. java实现一个点餐系统
  10. python打印9宫格25宫格81宫格.....