矩形面积并变形,一层一层的算体积

#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std; const long long maxn=+;
struct Seg
{
long long x;
long long Y1,Y2;//离散化之后的坐标
long long flag;
} s[maxn];
long long X1[maxn],X2[maxn],Y1[maxn],Y2[maxn],V[maxn];
long long p[],pp[];
map<long long ,long long>m;
long long M[maxn];
long long k;
long long n,tot,h;
long long sum,ans; struct SegTree
{
long long len;
long long cover;
} segTree[maxn*]; bool cmp(const Seg&a,const Seg&b)
{
return a.x<b.x;
} void lsh()
{
k=;
m.clear();
for(long long i=; i<=n; i++)
{
if(m[Y1[i]]==) M[k++]=Y1[i],m[Y1[i]]=;
if(m[Y2[i]]==) M[k++]=Y2[i],m[Y2[i]]=;
}
sort(M,M+k);
m.clear();
for(long long i=; i<k; i++) m[M[i]]=i;
} void build(long long l,long long r,long long rt)
{
segTree[rt].cover=;
segTree[rt].len=;
if(l==r) return;
long long m=(l+r)/;
build(l,m,*rt);
build(m+,r,*rt+);
} void pushUp(long long rt,long long l,long long r)
{
if(segTree[rt].cover) segTree[rt].len=M[r]-M[l-];
else segTree[rt].len=segTree[*rt].len+segTree[*rt+].len;
} void update(long long info,long long L,long long R,long long l,long long r,long long rt)
{
if(L<=l&&r<=R)
{
segTree[rt].cover=segTree[rt].cover+info;
pushUp(rt,l,r);
return;
} long long m=(l+r)/;
if(L<=m) update(info,L,R,l,m,*rt);
if(R>m) update(info,L,R,m+,r,*rt+);
pushUp(rt,l,r);
} int main()
{
long long T,zz=;
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&n,&h);
p[]=;
for(long long i=;i<=h;i++)
{
scanf("%lld",&p[i]);
pp[i]=p[i];
}
sort(pp+,pp+h+);
for(long long i=; i<=n; i++){
scanf("%lld%lld%lld%lld%lld",&X1[i],&Y1[i],&X2[i],&Y2[i],&V[i]);
V[i]=p[V[i]];
} lsh();
long long Ans=;
for(long long r=; r<=h; r++)
{
tot=;
for(long long i=; i<=n; i++)
{
if(V[i]>=pp[r])
{
s[tot].x=X1[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=,tot++;
s[tot].x=X2[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=-,tot++;
}
}
sort(s,s+tot,cmp);
ans=;
build(,k,); for(long long i=; i<tot; i++)
{
sum=segTree[].len;
ans=ans+sum*(s[i].x-s[i-].x);
update(s[i].flag,s[i].Y1+,s[i].Y2,,k,);
}
Ans=Ans+ans*(pp[r]-pp[r-]);
}
printf("Case %lld: ",zz++);
printf("%lld\n",Ans);
}
return ;
}

HDU 3255 Farming的更多相关文章

  1. hdu 3255 Farming(扫描线)

    题目链接:hdu 3255 Farming 题目大意:给定N个矩形,M个植物,然后给定每一个植物的权值pi,pi表示种植物i的土地,单位面积能够收获pi,每一个矩形给定左下角和右上角点的坐标,以及s, ...

  2. HDU 3255 Farming (线段树+扫面线,求体积并)

    题意:在一块地上种蔬菜,每种蔬菜有个价值.对于同一块地蔬菜价值高的一定是最后存活,求最后的蔬菜总值. 思路:将蔬菜的价值看做高度的话,题目就转化成求体积并,这样就容易了. 与HDU 3642 Get ...

  3. HDU 3255 扫描线(立方体体积并变形)

    Farming Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  4. hdu 3255 体积并

    http://www.cnblogs.com/kane0526/archive/2013/03/07/2948446.html http://blog.csdn.net/acdreamers/arti ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 【HDU 3810】 Magina (01背包,优先队列优化,并查集)

    Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of ...

  7. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  8. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. Entity FrameWork 实体属性为decimal时默认只保存2位小数

    问题描述:当采用EF的DbContext保存decimal类型数据到数据库,默认只会保存小数点后的前2位小数,其余均置0:例如保存101.182352152322,实际存到数据库里的数据为101.18 ...

  2. 导航条css实现和table实现

    导航条式样 <style type="text/css"> ul,li{ margin:0; padding:0; list-style:none; } #navtop ...

  3. 关于IP在MySQL中的存储

    对于很多新手而言,他们总会纠结,怎样才能更好的设计MySQL数据库呢:作为一个从菜鸟走过来的人,深有体会,刚开始我也不知道什么是外键.什么是事务处理.怎样合理的定义一个字段,说到字段,今天我就带领大家 ...

  4. parted

    1.选择分区表 sudo parted -s /dev/sdXX mklabel gpt 2.创建分区 sudo parted -s -- /dev/sdX mkpart primary 0 -1s ...

  5. 给Notepad++ 加带图标右键菜单

    给Notepad++ 加带图标右键菜单 方式一: 拷贝以下代码建立一个reg文件,替换相关路径,保存,双击运行加入注册表 Windows Registry Editor Version 5.00 [H ...

  6. android 代码动态创建视图

    LinearLayout 如何动态设置 margin? LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayou ...

  7. HDU1171--Big Event in HDU(多重背包)

    Big Event in HDU   Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  8. Lucene.NET中Field.Index 和 Field.Store的几种属性的用法

    转载自 http://blog.csdn.net/yja886/article/details/6612069 lucene在doc.add(new Field("content" ...

  9. java 继承与多态

    Example5_11.java class 动物 { void cry() { } } class 狗 extends 动物 { void cry() { System.out.println(&q ...

  10. Struts2 设置--Myelipse

    1. Windows---preferrence---Myeclipse---Server----Tomcat 2. Windows---preferrence---Java---Installed ...