HDU3255(线段树+扫描线)
题目: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(线段树+扫描线)相关推荐
- hdu3255 线段树扫描线求体积
题意: 给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路: 线段树扫描线 ...
- 线段树扫描线求矩形周长详解
线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- hdu 1542 Atlantis (线段树+扫描线)
http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)
1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 732 Solved: ...
- 亚特兰蒂斯【线段树+扫描线+离散化】
亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...
- 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化
F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...
- 单调栈 or 线段树扫描线 ---- E. Delete a Segment [单调栈+二分] [扫描线处理空白位置的技巧乘2]
题目链接 题目大意: 给出nnn个线段代表集合,现在问若可以将其中任意一个线段删除,则能够形成最多多少个独立的集合(取并集后) 解题思路1: 首先我们先对线段按照起点排序 那么我们枚举删除的线段iii ...
最新文章
- .Net 3.5新特性(1)Automatic Properties, Object Initializers, and Collection Initializers
- java 递归_Java的递归、如何与流相结合
- python 字母顺序计数_计数并说出顺序
- 热浪(信息学奥赛一本通-T1379)
- sv_labs学习笔记——sv_lab5_上(System Verilog)
- python时间模块time
- html JS实现下拉菜单,vue.js怎么实现下拉框
- java 微信开发图片发送,微信开发?Java上传Base64图片
- ARP使用及网络通信(查询、绑定MAC地址)
- Java面向对象编程三大特征 - 继承
- IP地址自动切换脚本
- gerrit常见问题及解决方法
- 【SpringBoot】63、SpringBoot中教你手把手封装自己的starter(xxl-job-spring-boot-starter)
- MySQL江湖路 | 专栏目录
- 我所理解的闭包是酱紫的
- VScode窗口保持
- c语言遍历算法的头文件,图优先遍历算法(C语言版).doc
- crontab环境变量问题
- 怎样在网页添加访问计数器?
- RET RETF IRET IRETD 指令的不同
热门文章
- Spring 事务core 模块-RowMapper
- 消息消费端的确认机制
- toString和newString的原理
- ServletAPI介绍
- 方法练习3_打印指定次数的HelloWorld
- plsql(轻量版)_游标的使用1
- _Linux 的文件系统及文件缓存知识点整理
- java web 之间通信,【Java】Web发展中通信的方式有哪些呢?
- data中的数据如何在innerhtml中调用_Vuex中调用state数据
- 解决MySQL删除外键时报错Error Code: 1091. Can‘t DROP ‘XXX‘; check that column/key exists