bzoj 3225: [Sdoi2008] 立方体覆盖 题解
【原题】
3225: [Sdoi2008]立方体覆盖
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 51 Solved: 36
[Submit][Status]
Description
A君按纵坐标建立线段树后按横坐标扫描计算。轻易AC了这道题,时间复杂度为O(NlogN)。
Input
Output
Sample Input
0 0 0 3
1 –1 0 1
19 3 5 6
Sample Output
HINT
对于 100% 的数据。1≤N≤100
对于 100% 的数据,-1000≤x, y, z≤1000。1≤r≤200
【做法1】n=100?暴力能过吗?暴力离散、统计。。极限效率大概是:200^3*100。并且去重能够提高一点效率。
【代码1】
#include<cstdio>
#include<algorithm>
#define N 105
#define M 210
using namespace std;
int n,X,Y,Z,R,hx,hy,hz,tx,ty,tz,i,j,k,p,flag,ans;
int x1[N],x2[N],y1[N],y2[N],z1[N],z2[N],xx[M],yy[M],zz[M],x[M],y[M],z[M];
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d%d%d%d",&X,&Y,&Z,&R);
x1[i]=X-R;x2[i]=X+R;
y1[i]=Y-R;y2[i]=Y+R;
z1[i]=Z-R;z2[i]=Z+R;
}
for (i=1;i<=n;i++)
{
xx[++hx]=x1[i];xx[++hx]=x2[i];
yy[++hy]=y1[i];yy[++hy]=y2[i];
zz[++hz]=z1[i];zz[++hz]=z2[i];
}
sort(xx+1,xx+hx+1);xx[0]=xx[1]-1;
sort(yy+1,yy+hy+1);yy[0]=yy[1]-1;
sort(zz+1,zz+hz+1);zz[0]=zz[1]-1;
for (i=1;i<=hx;i++) if (xx[i]!=xx[i-1]) x[++tx]=xx[i];
for (i=1;i<=hy;i++) if (yy[i]!=yy[i-1]) y[++ty]=yy[i];
for (i=1;i<=hz;i++) if (zz[i]!=zz[i-1]) z[++tz]=zz[i];
for (i=1;i<tx;i++)
for (j=1;j<ty;j++)
for (k=1;k<tz;k++)
{
flag=1;
for (p=1;p<=n&&flag;p++)
if (x1[p]<=x[i]&&x[i+1]<=x2[p]&&y1[p]<=y[j]&&y[j+1]<=y2[p]&&z1[p]<=z[k]&&z[k+1]<=z2[p])
flag=0;
if (!flag) ans+=(x[i+1]-x[i])*(y[j+1]-y[j])*(z[k+1]-z[k]);
}
printf("%d",ans);
return 0;
}
【分析2】那么我们就乖乖地写标算。显然。直接线段树套线段树有点虚啊。
于是我先枚举离散后的H,再次基础上建立满足条件的x和y。这样转化成了经典的NLOG(N)的矩形面积并了。
利用扫描线的思想。把每一条竖边取出并按x从左到右快排。然后扫描。假设一条边是始边,把线段树中的y1--y2加1。否则把y1--y2减1。然后对于每个不同的x,把线段树中覆盖层数大于1的个数*(x[i+1]-x[i])。
这个线段树的细节非常多。比方线段树建立是l~mid,mid~r。然后叶子节点是l~l+1。
【代码2】
#include<cstdio>
#include<algorithm>
#define N 105
#define A 1200
#define M 210
using namespace std;
struct Tree{int l,r,sum,cover;}a[M*2*16];
struct arr
{
int x,l,r,p;
friend bool operator < (const arr &a,const arr &b)
{
if (a.x!=b.x) return a.x<b.x;
return !a.p&&b.p;
}
}E[M*2];
int n,X,Y,Z,r,hz,tz,L,R,i,j,k,opt,h,hy,ty,p,tot,flag,temp,H,W,ans;
int x1[N],x2[N],y1[N],y2[N],z1[N],z2[N],zz[M],z[M],yy[M],y[M],pre[2405];
void build(int k,int l,int r)
{
a[k].l=l;a[k].r=r;a[k].sum=0;a[k].cover=0;
if (l+1==r||l==r) return;int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid,r);
}
void Cover_Add(int k)
{
if (L<=a[k].l&&a[k].r<=R)
{
if (!opt) a[k].cover++,a[k].sum=y[a[k].r]-y[a[k].l];
else if (!(--a[k].cover)) a[k].sum=(a[k].l+1>=a[k].r)? 0:a[k<<1].sum+a[(k<<1)+1].sum;
return;
}
int mid=(a[k].l+a[k].r)/2;
if (L<mid) Cover_Add(k<<1);
if (R>mid) Cover_Add(k<<1|1);
if (!a[k].cover) a[k].sum=a[k<<1].sum+a[k<<1|1].sum;
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d%d%d%d",&X,&Y,&Z,&r);
x1[i]=X-r;x2[i]=X+r;
y1[i]=Y-r;y2[i]=Y+r;
z1[i]=Z-r;z2[i]=Z+r;
}
for (i=1;i<=n;i++)
zz[++hz]=z1[i],zz[++hz]=z2[i];
sort(zz+1,zz+hz+1);zz[0]=zz[1]-1;
for (i=1;i<=hz;i++) if (zz[i]!=zz[i-1]) z[++tz]=zz[i];
for (k=1;k<tz;k++)
{
H=z[k+1]-z[k];h=hy=ty=0;temp=tot=0;
for (i=1;i<=n;i++)
if (z1[i]<=z[k]&&z[k+1]<=z2[i])
{
E[++h]=(arr){x1[i],y1[i],y2[i],0};
E[++h]=(arr){x2[i],y1[i],y2[i],1};
yy[++hy]=y1[i];yy[++hy]=y2[i];
}
sort(yy+1,yy+hy+1);yy[0]=yy[1]-1;
for (i=1;i<=hy;i++) if (yy[i]!=yy[i-1]) y[++ty]=yy[i],pre[yy[i]+A]=++tot;
if (!ty) continue;
sort(E+1,E+h+1);build(1,1,ty);
for (i=1;i<h;i++)
{
W=E[i+1].x-E[i].x;
L=pre[E[i].l+A];R=pre[E[i].r+A];opt=E[i].p;
Cover_Add(1);
if (E[i].x!=E[i+1].x||i+1==h) temp+=a[1].sum*W;
}
ans+=temp*H;
}
printf("%d",ans);
return 0;
}
bzoj 3225: [Sdoi2008] 立方体覆盖 题解的更多相关文章
- bzoj3225 [Sdoi2008]立方体覆盖——扫描线
3225: [Sdoi2008]立方体覆盖 Description A君近日为准备省队选拔,特意进行了数据结构的专项训练.训练过程中就遇到了“矩形面积并”这道经典问题,即:给出N个各边与坐标轴平行(垂 ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
- Code[VS] 1022 覆盖 题解
Code[VS] 1022 覆盖 题解 Hungary Algorithm 题目传送门:Code[VS] 1022 题目描述 Description 有一个N×M的单位方格中,其中有些方格是水塘,其 ...
- BZOJ 3227: [Sdoi2008]红黑树(tree)
BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...
- BZOJ 4033: [HAOI2015]树上染色题解
BZOJ 4033: [HAOI2015]树上染色题解(树形dp) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327400 原题地址: BZOJ 403 ...
- BZOJ 2190: [SDOI2008]仪仗队
2190: [SDOI2008]仪仗队 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2689 Solved: 1713[Submit][Statu ...
- BZOJ 2049: [Sdoi2008]Cave 洞穴勘测 LCT
2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnli ...
- Bzoj 2186: [Sdoi2008]沙拉公主的困惑 乘法逆元,线性筛,欧拉函数,数论
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2560 Solved: 857[Submit][St ...
- bzoj 1337 最小圆覆盖
/************************************************************** Problem: 1337 User: idy002 Language: ...
随机推荐
- 防止iframe嵌套
如果你哪个页面不想被嵌套 下面js代码可以解决(我的是火狐) 慎用 <script type="text/javascript"> window.on ...
- select、poll、epoll用法
我们先从著名的C10K问题开始探讨,由于早期在网络还不普及的时候,互联网的用户并不是很多,一台服务器同时在线100个用户估计在当时已经算是大型应用了.但是随着互联网的发展,用户群体迅速的扩大,每一个用 ...
- chrome调试状态下动态加载的js
在js文件中加入 //@ sourceURL=文件名.js
- echshop jquery与transpart冲突解决?
<script type="text/javascript">$(function() {window.__Object_toJSONString = Object.p ...
- 不让input表单的输入框保存用户输入的历史记录
如何不让input表单的输入框保存用户输入的历史记录. 有时我们在设计网页时不想让表单保存用户输入历史记录,比如一些隐私数据,或一些冲值卡 <input name="test&quo ...
- ARM的BIN文件反汇编方法
最近在调试uboot的代码时,用的新版本的uboot,lowlevel_init函数里是空的,而且在链接文件中也没有发现对lowlevel_init.o的链接.在bl lowlevel_init 之前 ...
- Linux学习2
第三讲Linux常用命令04 压缩:gzip: 1.只能压缩文件,不能压缩目录 2.不保留源文件 解压缩:gunzip gzip -d ------------------------------ ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- 用硬件(Verilog)实现二进制码和格雷码的转换
格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环. ...
- Keil c51现No Browse information available
keil c51 不能使用:Go to Definition of....的解决方法 最近使用keil c51 开发usb固件,当向vc一样使用Go to Definition of....时,出现警 ...