题意:

      给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值。

思路:

      线段树扫描线求长方体体积,对于求体积,如果理解求面积的过程,求体积也很容易理解,就是先一层一层的求面积,然后把面积当成"当前所覆盖的线段",以长方体的高的方向更新,不是很容易说清楚,看下代码就懂了,就体积的时候就是先求出一层面积,然后在用一层一层的面积更新体积,具体看代码吧,应该很容易理解,说着感觉很费劲。


#include<stdio.h>
#include<string.h>
#include<algorithm> #define N 65000
#define Nmax 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; typedef struct
{
__int64
x1 ,x2 ,y1 ,y2;
__int64
pri;
}
NODE; EDGE edge[N];
NODE node[33000];
__int64
len[Nmax] ,cnt[Nmax];
__int64
tmp[Nmax] ,num[Nmax];
__int64
price[5]; bool camp(EDGE a ,EDGE b)
{
return
a.h < b.h;
} int
search(int id ,__int64 now)
{
int
low ,up ,mid ,Ans;
low = 1 ,up = id;
while(
low <= up)
{

mid = (low + up) >> 1;
if(
now <= num[mid])
{

Ans = mid;
up = mid - 1;
}
else
low = mid + 1;
}
return
Ans;
} void
Pushup(__int64 l ,__int64 r ,__int64 t)
{
if(
cnt[t]) len[t] = num[r] - num[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)
{
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
solve(int n ,int m)
{
__int64
Ans = 0 ,i ,id;
sort(price + 1 ,price + m + 1);
price[0] = 0;
for(int
ii = 1 ;ii <= m ;ii ++)
{
int
nn = 0;
for(
id = 0 ,i = 1 ;i <= n ;i ++)
{
if(
node[i].pri < price[ii]) continue;
nn += 2;
edge[++id].l = node[i].x1;
edge[id].r = node[i].x2 ,edge[id].h = node[i].y1 ,edge[id].mk = 1;
tmp[id] = node[i].x1; edge[++id].l = node[i].x1;
edge[id].r = node[i].x2 ,edge[id].h = node[i].y2 ,edge[id].mk = -1;
tmp[id] = node[i].x2;
}

sort(tmp + 1 ,tmp + id + 1);
id = 0;
for(
i = 1 ;i <= nn ;i ++)
if(
i == 1 || tmp[i] != tmp[i-1])
num[++id] = tmp[i]; sort(edge + 1 ,edge + nn + 1 ,camp);
memset(len ,0 ,sizeof(len));
memset(cnt ,0 ,sizeof(cnt));
__int64
ans = 0;
edge[0].h = edge[1].h;
for(
i = 1 ;i <= nn ;i ++)
{

ans += len[1] * (edge[i].h - edge[i-1].h);
__int64
ll = search(id ,edge[i].l);
__int64
rr = search(id ,edge[i].r);
Update(1 ,nn ,1 ,ll ,rr ,edge[i].mk);
}

Ans += ans * (price[ii] - price[ii-1]);
}
return
Ans;
} int main ()
{
int
t ,n ,m ,cas = 1;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
for(int
i = 1 ;i <= m ;i ++)
scanf("%I64d" ,&price[i]);
for(int
i = 1 ;i <= n ;i ++)
{

scanf("%I64d %I64d %I64d %I64d %I64d" ,&node[i].x1 ,&node[i].y2 ,&node[i].x2 ,&node[i].y1 ,&node[i].pri);
node[i].pri = price[node[i].pri];
}

printf("Case %d: %I64d\n" ,cas ++ ,solve(n ,m));
}
return
0;
}

hdu3255 线段树扫描线求体积的更多相关文章

  1. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  2. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  3. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  4. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  5. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

  6. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  7. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

  8. POJ1151+线段树+扫描线

    /* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  9. POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]

    题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...

随机推荐

  1. django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions impo ...

  2. 优化自动化测试流程,使用 flask 开发一个 toy jenkins工具

    1.自动化 某一天你入职了一家高大上的科技公司,开心的做着软件测试的工作,每天点点点,下班就走,晚上陪女朋友玩王者,生活很惬意. 但是美好时光一般不长,这种生活很快被女主管打破.为了提升公司测试效率, ...

  3. (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)

    题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...

  4. 轻量易用的微信Sdk发布——Magicodes.Wx.Sdk

    概述 最简洁最易于使用的微信Sdk,包括公众号Sdk.小程序Sdk.企业微信Sdk等,以及Abp VNext集成. GitHub地址:https://github.com/xin-lai/Magico ...

  5. P1028_数的计算(JAVA语言)

    题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(0n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能 ...

  6. Manjaro Linux平台用pyinstaller打包python可执行文件

    技术背景 当我们创建一个python项目,最终的成果如果希望用户能够不依赖于python源代码也能够正常的执行,就会比较的人性化.因为源代码数量众多,很难让每个用户都自行管理所有的源代码,因此我们需要 ...

  7. C. 【例题3】畜栏预定

    C . [ 例 题 3 ] 畜 栏 预 定 C. [例题3]畜栏预定 C.[例题3]畜栏预定 题解 考虑贪心 Code #include <bits/stdc++.h> using nam ...

  8. CyclicBarrier:人齐了,老司机就可以发车了!

    上一篇咱讲了 CountDownLatch 可以解决多个线程同步的问题,相比于 join 来说它的应用范围更广,不仅可以应用在线程上,还可以应用在线程池上.然而 CountDownLatch 却是一次 ...

  9. Java内置内存分析

    Java内存分析 package com.chao.reflection; public class Test05 { public static void main(String[] args) { ...

  10. vm16 安装 || 待检验 || 预测无问题

    vm16 安装 安装 下载 下载地址 管理员运行 安装 其余都点下一步/NEXT 激活 完成