窗口的星星
时间:2019-09-15
本文章向大家介绍窗口的星星,主要包括窗口的星星使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
洛咕
题意:天真的小卡总是希望能够在晚上能看到最多最亮的星星,但是窗子的大小是固定的,边也必须和地面平行。这时小卡使用了超能力(透视术)知道了墙后面每个星星的位置和亮度,但是小卡发动超能力后就很疲劳,只好拜托你告诉他最多能够有总和多亮的星星能出现在窗口上。
分析:巧妙地转化为扫描线.对于每颗星星,转化为一个以该星星为左下角,宽为W,高为H的矩形.意思就是以这个矩形内的任意一点为右上角作矩形,就能包括到这颗星星.所以题目转化为了有n个矩形,每个矩形的收益就是这颗星星的价值.\(n<=10000,1<=W,H<=1000000.\)
转化之后就是扫描线板子题了.线段树维护区间最大值就行了.因为有区间赋值操作,虽然不需要维护区间和,但是要用到延迟标记.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=5e5+5;//开大一点
int a[N];
struct line{int x,y1,y2,k;}e[N];
inline bool cmp(const line &x,const line &y){
return x.x==y.x?x.k<y.k:x.x<y.x;
}
struct xd_tree{int l,r;ll add,maxn;}t[N<<1];
inline void build(int p,int l,int r){
t[p].l=l;t[p].r=r;
if(l==r)return;
int mid=(l+r)>>1;
build(p<<1,l,mid);build(p<<1|1,mid+1,r);
}
inline void spread(int p){
if(!t[p].add)return;
t[p<<1].maxn+=t[p].add;
t[p<<1|1].maxn+=t[p].add;
t[p<<1].add+=t[p].add;
t[p<<1|1].add+=t[p].add;
t[p].add=0;
}
inline void change(int p,int l,int r,int v){
if(l<=t[p].l&&t[p].r<=r){t[p].add+=v;t[p].maxn+=v;return;}
spread(p);int mid=(t[p].l+t[p].r)>>1;
if(l<=mid)change(p<<1,l,r,v);
if(r>mid)change(p<<1|1,l,r,v);
t[p].maxn=max(t[p<<1].maxn,t[p<<1|1].maxn);
}
int main(){
int T=read();
while(T--){
int n=read(),w=read(),h=read(),tot=0;
for(int i=1;i<=n;++i){
int x=read(),y=read(),c=read();
e[(i<<1)-1].x=x;e[(i<<1)-1].y1=y;e[(i<<1)-1].y2=y+h-1;e[(i<<1)-1].k=c;
e[i<<1].x=x+w;e[i<<1].y1=y;e[i<<1].y2=y+h-1;e[i<<1].k=-c;
a[++tot]=y;a[++tot]=y+h-1;
}
sort(a+1,a+tot+1);
int sum=unique(a+1,a+tot+1)-a-1;
n<<=1;
for(int i=1;i<=n;++i){
int pos1=lower_bound(a+1,a+sum+1,e[i].y1)-a;
int pos2=lower_bound(a+1,a+sum+1,e[i].y2)-a;
e[i].y1=pos1;e[i].y2=pos2;
}
sort(e+1,e+n+1,cmp);
ll ans=0;build(1,1,n);
for(int i=1;i<=n;++i){
change(1,e[i].y1,e[i].y2,e[i].k);
ans=max(ans,t[1].maxn);
}
printf("%lld\n",ans);
}
return 0;
}
原文地址:https://www.cnblogs.com/PPXppx/p/11522344.html
- spark开发基础之从Scala符号入门Scala
- spark入门(2.0.1版本):概述,下载,编译,运行环境及实例运行
- 切片的内部实现
- go interface
- 使用Spark MLlib给豆瓣用户推荐电影
- hadoop,hbase,hive,zookeeper版本整合兼容性最全,最详细说明【适用于任何版本】
- centos7:SSH公钥无密码认证
- Spark机器学习API之特征处理
- hadoop入门:第十章hadoop工具
- hive文件存储格式:SequenceFile系统总结
- openshift镜像构建-s2i环境变量设置
- Go Channel 源码剖析
- 再谈谈获取 goroutine id 的方法
- Golang方法和接口
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOs7下Zabbix安装教程——准备工作
- python:HTTP Error 505: HTTP Version Not Supported
- PYES异常: TypeError: 'NoneType' object is not callable
- 第十八篇 zabbix创建自定义报警媒介
- 原创|如果懂了HashMap这两点,面试就没问题了
- RTSP协议网络摄像头互联网直播开源流媒体平台
- RTSP协议网页无插件播放,匿名登录不显示设备资源如何解决?
- 设计模式~代理模式
- Linux工具入门:make工具与Makefile文件
- PF_RING的多种负载均衡方法
- 【拓展】686- 如何在 Web 上大规模生成 UUID
- Linux进程管理与性能监控
- 重学数据结构(一、线性表)
- Jmeter系列(49)- 详解 HTTP Cookie 管理器
- java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决