bzoj3225 [Sdoi2008]立方体覆盖——扫描线
3225: [Sdoi2008]立方体覆盖
Description
Input
Output
Sample Input
3
0 0 0 3
1 –1 0 1
19 3 5 6
Sample Output
1944
HINT
对于 100% 的数据,1≤N≤100
对于 100% 的数据,-1000≤x, y, z≤1000,1≤r≤200
思路
看到题目的描述,就很容易想到扫描线,但是扫描线是二维的,这道题是三维的,怎么办?
我们运用扫描线的思想,将这些立方体分隔成为许多的小立方体(如下图)。我们这样就可以每一次计算小立方体就可以了,每一次我们运用扫描线求出众多矩形的面积并,再乘以横向的长度,就可以求出小体积,再将这些小体积相加,就是答案。具体扫描线以及其思想请看:扫描线讲解
代码
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 101
#define inf 1000
int n,cnt,idx,root,ans,tot;
int son[3000<<5][2],times[3000<<5],sum[3000<<5];
struct Surface {int x1,y1,x2,y2,z,kind;}surface[N<<5];
bool cmp1(const Surface &a,const Surface &b) {return a.z<b.z;}
struct Line {int x,y1,y2,kind;}line[N<<1];
bool cmp2(const Line &a,const Line &b) {return a.x<b.x;}
void update(int p,int l,int r)
{(times[p])?sum[p]=r-l+1:sum[p]=sum[son[p][0]]+sum[son[p][1]];}
void change(int &p,int l,int r,int x,int y,int delta)
{
if(!p) p=++cnt;
if(x<=l&&r<=y) {times[p]+=delta,update(p,l,r);return;}
int mid=(l+r)>>1;
if(x<=mid) change(son[p][0],l,mid,x,y,delta);
if(y>mid) change(son[p][1],mid+1,r,x,y,delta);update(p,l,r);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
surface[++idx].z=c-d,surface[idx].x1=a-d;
surface[idx].y1=b+d,surface[idx].x2=a+d;
surface[idx].y2=b-d,surface[idx].kind=1;
surface[++idx].z=c+d,surface[idx].x1=a-d;
surface[idx].y1=b+d,surface[idx].x2=a+d;
surface[idx].y2=b-d,surface[idx].kind=-1;
}
sort(surface+1,surface+idx+1,cmp1),surface[idx+1].z=surface[idx].z;
for(int i=1,tmp=0;i<=idx;tmp=0)
{
int area=0;
while(surface[i].z==surface[i+tmp].z&&i+tmp<=idx) tmp++;
for(int j=0;j<tmp;j++)
{
line[++tot].x=surface[j+i].x1,line[tot].y1=surface[j+i].y2;
line[tot].y2=surface[j+i].y1-1;
line[tot].kind=1*surface[i+j].kind;
line[++tot].x=surface[j+i].x2,line[tot].y1=surface[j+i].y2;
line[tot].y2=surface[j+i].y1-1;
line[tot].kind=-1*surface[i+j].kind;
}sort(line+1,line+tot+1,cmp2);
for(int j=1,now=0;j<=tot;j+=now,now=0)
{
area+=sum[root]*(-line[j-1].x+line[j].x);
while(line[j+now].x==line[j].x)
change(root,-inf,inf,line[j+now].y1,line[j+now].y2
,line[j+now].kind),now++;
}i+=tmp;
ans+=area*(surface[i].z-surface[i-1].z);
}
printf("%d",ans);
}
bzoj3225 [Sdoi2008]立方体覆盖——扫描线的更多相关文章
- bzoj 3225: [Sdoi2008] 立方体覆盖 题解
[原题] 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 51 Solved: 36 [Submit][S ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【SDOI2008】解题汇总
好叭我真的是闲的了... /---------------------------------------------/ BZOJ-2037 [SDOI2008]Sue的小球 DP+相关费用提前计算 ...
- [C4W1] Convolutional Neural Networks - Foundations of Convolutional Neural Networks
第一周 卷积神经网络(Foundations of Convolutional Neural Networks) 计算机视觉(Computer vision) 计算机视觉是一个飞速发展的一个领域,这多 ...
- HDU 3255 扫描线(立方体体积并变形)
Farming Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- HDU 3642 扫描线(立方体体积并)
Get The Treasury Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU-1255 覆盖的面积 (扫描线)
题目大意:给若干个矩形,统计重叠次数不为0的面积. 题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可.这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC. ...
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
ZOJ 3597 题意是说有n把枪,有m个靶子,每把枪只有一发子弹(也就是说一把枪最多只能打一个靶子), 告诉你第 i 把枪可以打到第j个靶, 现在等概率的出现一个连续的P把枪,在知道这P把枪之后,你 ...
随机推荐
- USACO Section1.2 Palindromic Squares 解题报告
palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- Pytest框架介绍
Pytest框架介绍.安装 pytest是python测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大 pytest特征 1:断言提示信 ...
- Entity Framework(一)
相关知识点复习: 1.var 类型推断: var p=new Person(); 2.匿名类型: var a=new {Name="wang",Age=12 }; 3.给新创建的 ...
- Oz 创建CentOS6镜像
参考 http://linuxblind.blog.51cto.com/7616603/1655550/ http://www.chenshake.com/oz-making-centos-mirro ...
- 使用pdb模块调试Python
在Python中,我们需要debug时,有三种方式: 加log语句.最简单的方式是添加print()语句来输出我们想要获知的状态或者变量,好处是简单容易操作,坏处是debug完了之后,还需要将prin ...
- Java API操作ZooKeeper
创建会话 package org.zln.zk; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watch ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]
题面 传送门 思路 首先,我们把这个输入的点的生成函数搞出来: $C=\sum_{i=0}^{lim}s_ix^i$ 其中$lim$为集合里面出现过的最大的数,$s_i$表示大小为$i$的数是否出现过 ...
- 洛谷 P2375 [NOI2014]动物园 解题报告
P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...
- Eclipse使用Maven内置插件不需要安装Maven
首先修改eclipse项目中maven的路径,默认在C盘,修改路径例如 在d盘创建文件夹-D:- |---m2 |--repository |--setting.xml 没有文件夹和文件要自己新建,如 ...