题目:http://acm.hdu.edu.cn/showproblem.php?pid=3255

题意:在一块地上种蔬菜,对于同一块地蔬菜价值高的一定是最后存活,求最后的蔬菜总值,也就是不同的矩形覆盖,有的矩

形肯定在最上面。

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N = 160005;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int cnt[N],M,v[N];
double D[N],sum[N];
struct Line
{
double l,r,h;
int s,v;
Line(){}
Line(double a,double b,double c,int d,int e):l(a),r(b),h(c),s(d),v(e){}
bool operator< (const Line &cmp)const
{
return h<cmp.h;
}
}L[N],temp[N];
int BinarySearch(double x)
{
int l,r,m;
l=1;r=M;
while(l<=r)
{
m=(l+r)>>1;
if(D[m]==x)
return m;
if(D[m]<x) l=m+1;
else  r=m-1;
}
}
void Pushup(int l,int r,int rt)
{
if(cnt[rt]) sum[rt] = D[r+1] - D[l];
else if(l==r) sum[rt]=0;
else  sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Update(int x,int y,int z,int l,int r,int rt)
{
if(x<=l&&r<=y)
{
cnt[rt]+=z;
Pushup(l,r,rt);
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
Update(x,y,z,lson);
if(y>mid)
Update(x,y,z,rson);
Pushup(l,r,rt);
}
int main()
{
int n,i,j,k,ca=1,l,r,m,ct,t;
double ans,lx,ly,rx,ry;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
k=0;
for(i=1;i<=m;i++)
scanf("%d",&v[i]);
for(i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf%d",&lx,&ly,&rx,&ry,&r);
D[++k]=lx;
L[k]=Line(lx,rx,ly,1,v[r]);
D[++k]=rx;
L[k]=Line(lx,rx,ry,-1,v[r]);
}
sort(D+1,D+1+k);
sort(L+1,L+1+k);
M=1;
for(i=2;i<=k;i++)
if(D[i]!=D[i-1])
D[++M]=D[i];
ans=0;
v[0]=0;
sort(v,v+m+1);
for(j=1;j<=m;j++)
{
ct=0;
for(i=1;i<=k;i++)
if(L[i].v>v[j-1])
temp[ct++]=L[i];
memset(cnt,0,sizeof(cnt));
memset(sum,0,sizeof(sum));
for(i=0;i<ct-1;i++)
{
l=BinarySearch(temp[i].l);
r=BinarySearch(temp[i].r)-1;
if(l<=r)
Update(l,r,temp[i].s,1,M,1);
ans+=sum[1]*(double)(v[j]-v[j-1])*(temp[i+1].h-temp[i].h);
}
}
printf("Case %d: %.0lf\n",ca++,ans);
}
return 0;
}

HDU3255(线段树+扫描线)相关推荐

  1. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  2. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  3. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  4. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  5. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  6. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)

    1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 732  Solved: ...

  7. 亚特兰蒂斯【线段树+扫描线+离散化】

    亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...

  8. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

    F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...

  9. 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]

    题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...

最新文章

  1. .Net 3.5新特性(1)Automatic Properties, Object Initializers, and Collection Initializers
  2. java 递归_Java的递归、如何与流相结合
  3. python 字母顺序计数_计数并说出顺序
  4. 热浪(信息学奥赛一本通-T1379)
  5. sv_labs学习笔记——sv_lab5_上(System Verilog)
  6. python时间模块time
  7. html JS实现下拉菜单,vue.js怎么实现下拉框
  8. java 微信开发图片发送,微信开发?Java上传Base64图片
  9. ARP使用及网络通信(查询、绑定MAC地址)
  10. Java面向对象编程三大特征 - 继承
  11. IP地址自动切换脚本
  12. gerrit常见问题及解决方法
  13. 【SpringBoot】63、SpringBoot中教你手把手封装自己的starter(xxl-job-spring-boot-starter)
  14. MySQL江湖路 | 专栏目录
  15. 我所理解的闭包是酱紫的
  16. VScode窗口保持
  17. c语言遍历算法的头文件,图优先遍历算法(C语言版).doc
  18. crontab环境变量问题
  19. 怎样在网页添加访问计数器?
  20. RET RETF IRET IRETD 指令的不同

热门文章

  1. Spring 事务core 模块-RowMapper
  2. 消息消费端的确认机制
  3. toString和newString的原理
  4. ServletAPI介绍
  5. 方法练习3_打印指定次数的HelloWorld
  6. plsql(轻量版)_游标的使用1
  7. _Linux 的文件系统及文件缓存知识点整理
  8. java web 之间通信,【Java】Web发展中通信的方式有哪些呢?
  9. data中的数据如何在innerhtml中调用_Vuex中调用state数据
  10. 解决MySQL删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists