题面:

HDU---3642

题意:

简化一下,就是求N个立方体中重叠了3次及以上的体积和

分析:

类比于矩形面积并,我们以扫描面来切割立方体,只需计算出当前扫描面被覆盖了3次及以上的面积*相邻两个扫描面的高度差即可,不同于矩形面积并的做法的是:如果我们依然在线段树上记录每个扫描面的信息,那么必须要写二维线段树,这.....有点麻烦,由于N的范围不大,我们可以暴力找出包含了【当前扫描面的高度,下一个扫描面的高度】的所有立方体,然后对当前扫描面跑一遍扫描线求出覆盖了3次及以上的面积

代码:

#include <bits/stdc++.h>#define lson x<<1
#define rson x<<1|1
using namespace std;
typedef long long LL;
const int maxn = 2e3+223;
const int maxz = 505;
int T,n,x,y,z,xx,yy,zz,len,X[maxn],Z[maxn],tr[maxn<<2][4],tag[maxn<<2];
struct node{int l,r,w,h1,h2,op;
};
vector<node> ve,we;
void init(){len = 0;ve.clear();
}
bool cmp(node a,node b){return a.w < b.w;
}
void pushup(int x,int l,int r){if(tag[x] >= 3){tr[x][3] = X[r+1]-X[l];tr[x][2] = tr[x][1] = 0;}else if(tag[x] == 2){tr[x][1] = 0;tr[x][3] = tr[lson][1]+tr[rson][1]+tr[lson][2]+tr[rson][2]+tr[lson][3]+tr[rson][3];tr[x][2] = X[r+1]-X[l]-tr[x][3];}else if(tag[x] == 1){tr[x][3] = tr[lson][2]+tr[rson][2]+tr[lson][3]+tr[rson][3];tr[x][2] = tr[lson][1]+tr[rson][1];tr[x][1] = X[r+1]-X[l]-tr[x][3]-tr[x][2];}else{tr[x][1] = tr[lson][1] + tr[rson][1];tr[x][2] = tr[lson][2] + tr[rson][2];tr[x][3] = tr[lson][3] + tr[rson][3];}
}
void updata(int l,int r,int L,int R,int x,int op){if(l > R || r < L) return ;if(l >= L && r <= R){tag[x] += op;pushup(x,l,r);return ;}int mid = (l+r)>>1;updata(l,mid,L,R,lson,op);updata(mid+1,r,L,R,rson,op);pushup(x,l,r);
}
LL cal(){                                    //计算扫描线sort(we.begin(),we.end(),cmp);LL res = 0;for(int i = 0;i < (int)we.size(); ++i){int L = lower_bound(X,X+len,we[i].l)-X;int R = lower_bound(X,X+len,we[i].r)-X-1;updata(0,len,L,R,1,we[i].op);if(i<(int)we.size()-1) res += 1LL*tr[1][3]*(we[i+1].w-we[i].w);}return res;
}
LL solve(){                                  sort(X,X+len);sort(Z,Z+len);int lenz = unique(Z,Z+len) - Z;         //离散X,Z坐标len = unique(X,X+len) - X;LL res = 0;for(int i = 0;i < lenz-1; ++i){         //计算扫描面we.clear();                      for(int j = 0;j < (int)ve.size(); ++j){if(ve[j].h1 <= Z[i] && ve[j].h2 >= Z[i+1]) we.push_back(ve[j]);}res += cal()*(Z[i+1]-Z[i]);}return res;
}
int main(){cin >> T;for(int Case = 1;Case <= T; ++Case){cin >> n; init();while(n--){cin>>x>>y>>z>>xx>>yy>>zz;X[len] = x,X[len+1] = xx;Z[len] = z,Z[len+1] = zz;len += 2; ve.push_back(node{x,xx,y,z,zz,1});ve.push_back(node{x,xx,yy,z,zz,-1});}printf("Case %d: %lld\n",Case,solve());}return 0;
}

HDU---3642:Get The Treasury【立方体体积并】相关推荐

  1. 判断两立方体体积是否相等

    通过重写equals方法实现逻辑判断,代码如下: package com.tiger.practice; /** * 写一个 "立方体" 类, 长, 宽, 高, 重写 equals ...

  2. HDOJ 3642 Get The Treasury(扫描线 + 线段树 + 离散化 立方体的并)

    题意: 给一些长方体,求这些长方体相交至少3次的体积的并. 思路: 1. 先注意到 z 的变化范围 0 - 500,于是可以先把 z 离散化再枚举 z 坐标的高度. 2. 对于每一个 z[i] - z ...

  3. hdu 3642 体积并

    题意:求三个矩形体积的并 链接:点我 枚举z 1 #include<stdio.h> 2 #include<iostream> 3 #include<stdlib.h&g ...

  4. HDU 2289 Cup(二分+圆台体积)

    Problem Description The WHU ACM Team has a big cup, with which every member drinks water. Now, we kn ...

  5. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  6. 【转载】线段树题目2

    1.hdu1166 敌兵布阵 更新节点,区间求和. 2.hdu1754 I Hate It 更新节点,区间最值. . 3.hdu1698 Just a Hook 成段更新,总区间求和. . 4.hdu ...

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. kuangbin带你飞 专题1-23 题单

    kuangbin大神,对于打过ACM比赛的ACMer,无人不知无人不晓. 在此,附上vjudge平台上一位大神整理的[kuangbin带你飞]专题目录链接. [kuangbin带你飞专题目录1-23] ...

  10. 老鱼的-kuangbin专题题解

    kuangbin专题问题一览 专题一 简单搜索 POJ 1321 棋盘问题 POJ 2251 Dungeon Master POJ 3278 Catch That Cow POJ 3279 Flipt ...

最新文章

  1. 机器学习工作流程第一步:如何用Python做数据准备?
  2. 端口报错listen eaddrinuse:::xxx
  3. CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)...
  4. java基础学习笔记(二)
  5. 大数据分析如何助力制造行业
  6. javascript 计算后 无聊的小数点处理
  7. MES系统是什么?MES系统的操作流程是怎样?
  8. 鸟哥的linux私房菜——蔡德明
  9. 网址导航7654推广
  10. 2022搜狐校园算法大赛推荐赛道Rank2方案分享
  11. STM32cubIDE 黑色主题_儿童画创意第二弹 | 绘画的秘密+万圣节主题画,10个创意教程一次看完!...
  12. Codeforces Round #727 (Div. 2)_B. Love Song(前缀和)
  13. php_excel表中_如何自动将多行中文转换成拼音,Excel2007怎么批量将汉字转换为拼音...
  14. 人证核验终端设备技术
  15. JVM内置函数intrinsics简介
  16. 从校园到职场,别让父母限制了你的天花板
  17. B站500万粉up主党妹被黑客勒索:交钱赎“人”!顶级安全专家:无解
  18. 请求接口参数正确请求失败的问题
  19. 怎么让笔记本合上后显示屏不灭
  20. 阿里云NLP接口调用

热门文章

  1. NFine.Framework框架去除cookie后门
  2. NFT商城/NFT盲盒/虚拟盲盒/NFT交易/可定制二开
  3. php---兄弟连的php培训视频的总结(1)
  4. [excel]舒尔特练习法
  5. 其他干货——如何做科学报告(oral, poster, eLightning)
  6. TortoiseSVN - Download下载 - 1.5.4
  7. 2022JAVA面试题附答案(长期更新)
  8. 微信小程序图片四个API用法
  9. 三菱plc pwm指令_三菱PLC初学者只要解决这50个问题,那你就觉得很容易上手?
  10. 软件开发项目过程管理文档