Luogu P1502

题意很好理解,就是问给出的矩形套住的最大和。

但是做起来却十分麻烦。



——来自疯狂爆10分的愤怒

一个比较高效的思路是——把每一个星星作为左下角向右上方拓展形成一个矩形,

拓展的规则为只要窗口的右上角在这个矩形之内,就可以覆盖到这个星星。然后用线段树维护一条扫描线从左往右扫过去,寻找单点的最大值。

值得注意的是题面提出了窗框上的星星不计入答案,这样一搞整道题就变得相当恶心了

一个比较好理解且比较方便的做法就是以星星的横纵坐标+0.5作为矩形的左下角。

那么这样就能保证这个矩形符合拓展的规则了。

另外,由于星星的坐标很大,可以使用离散化缩小范围

code time:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson root<<1
#define rson root<<1|1
#define ll long long
using namespace std;
struct data
{
double l,r,x;
ll flag;
}line[80005];
bool cmp(data a,data b)
{
if (a.x==b.x) return a.flag<b.flag;
return a.x<b.x;
//重点之一,注意权值小的排在前面,因为在矩形的右边界上,这颗星星已经对答案没有贡献了
}
ll tag[80005],tree[80005],n,w,h,x,y,l,cnt,ans,T;
double pnt[80005];
void push_down(ll root,ll l,ll r)
{
tag[lson]+=tag[root];
tag[rson]+=tag[root];
tree[lson]+=tag[root];
tree[rson]+=tag[root];
tag[root]=0;
}*/
void update(ll root,ll l,ll r,double L,double R,ll flag)
{
if (L<=pnt[l]&&pnt[r]<=R)
{
tag[root]+=flag;
tree[root]+=flag;
return ;
}
if (l+1==r) return ;
if (R<=pnt[l]||L>=pnt[r]) return ;
push_down(root,l,r);
//事实上不需要pd操作也能过。
ll mid=(l+r)>>1;
if (L<pnt[mid]) update(lson,l,mid,L,R,flag);
if (R>pnt[mid]) update(rson,mid,r,L,R,flag);
//注意离散化后mid仅为下标,而不是坐标。
tree[root]=max(tree[lson],tree[rson])+tag[root];
}
int main()
{
scanf("%d",&T);
for (int q=1;q<=T;q++)
{
cnt=0;
ans=0;
memset(line,0,sizeof(line));
memset(pnt,0,sizeof(pnt));
memset(tree,0,sizeof(tree));
memset(tag,0,sizeof(tag));
//记得要初始化
scanf("%d%d%d",&n,&w,&h);
for (int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&l);
line[++cnt].x=x+0.5;line[cnt].l=y+0.5;line[cnt].r=y+h;line[cnt].flag=l;pnt[cnt]=y+h;
line[++cnt].x=x+w;line[cnt].l=y+0.5;line[cnt].r=y+h;line[cnt].flag=-l;pnt[cnt]=y+0.5;
//重点之一,对边界的处理
}
sort(line+1,line+1+cnt,cmp);
sort(pnt+1,pnt+1+cnt);
ll til=unique(pnt+1,pnt+1+cnt)-pnt-1;
for (int i=1;i<=cnt;i++)
{
update(1,1ll,til,line[i].l,line[i].r,line[i].flag);
ans=max(ans,tree[1]);
}
printf("%lld\n",ans);
}
return 0;
}

【Luogu P1502】窗口的星星的更多相关文章

  1. luogu P1502 窗口的星星

    题目链接 P1502 窗口的星星 题解 扫描线+线段树 线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小 按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围 维护扫描 ...

  2. 洛谷 P1502 窗口的星星 解题报告

    P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...

  3. 洛谷p1502窗口的星星 扫描线

    题目链接:https://www.luogu.org/problem/P1502 扫描线的板子题,把每个点看成矩形,存下边(x,y,y+h-1,li)和(x+w-1,y,y+h-1),在按横坐标扫线段 ...

  4. 【Luogu P1502】 窗口的星星

    →传送窗口 (复制一下题面好了~) 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,“哇~~~~好多星星啊”,但他还没给其他房间设一个窗户,天真的小 ...

  5. 【洛谷 P1502】 窗口的星星(扫描线)

    题目链接 把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形. \(-0.5\)是因为边框上的不算. 离散化\(y\)坐标. 记录\(2n\)个\(4\)元组\((x,y1 ...

  6. 【louguP1502】窗口的星星

    题目链接 用两条扫描线从左往右扫描,距离为W,右边的扫描线扫到就加上,左边的扫到就减去, 线段树上的一点\(x\)维护\((x,x+H)\)的星星总价值,修改时直接修改\((x-H,x)\)就行了 坐 ...

  7. luogu1502 窗口的星星

    扫描线应该打懒标记的-- #include <algorithm> #include <iostream> #include <cstdio> using name ...

  8. Luogu1502 窗口的星星 (线段树扫描线)

    将每个点拓展为矩形,将\(y\)离散,延\(x\)轴扫描,每次更新最值 用了一百年的pushdown操作疑似有问题,亦或这道题特殊,我乱改了pushdown位置就过了,我能怎么办,WA了一发,y数组没 ...

  9. 【学习笔记】线段树—扫描线补充 (IC_QQQ)

    [学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...

随机推荐

  1. 小程序多端差异调研报告(微信,支付宝,头条,QQ)

    已经使用uni-app开发并发布了一个跨端小程序啦,嘻嘻嘻!

  2. fenby C语言 P16

    while先判断,不符合,不执行 dowhile后判断,不符合,执行一次 #include <stdio.h> int main(){ int i=1,sum=0; do{ sum=sum ...

  3. Stringbuilder常用方法

    一.创建Stringbuilder对象StringBuilder strB = new StringBuilder(); 1.append(String str)/append(Char c):字符串 ...

  4. MySql逻辑结构简介

    结构示意图: 如上图,可把数据库的结构分成四层,见下图及文字说明  一.连接层提供客户端和连接服务,包含本地Sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信,主要完成一些类似于 ...

  5. 2018.8.13 python中生成器和生成器表达式

    主要内容: 1.生成器和生成器函数 2.列表推导式 一.生成器 生成器是指就是迭代器,在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也 ...

  6. 框架搭建与EF常用基类实现

    前两篇简单谈了一些.Net Core的优势以及机构设计的一些思路,这一篇开始,我们将从零开始搭建架构,底层我们将采用EF来访问数据库,所以这篇我们将贴一下EF常用操作的基类. 简单介绍下一些类库将要实 ...

  7. gym102302E_Chi's performance

    题意 给n个二元组(v,p),要求排序使得v从小到大,而且总价值最大,价值定义为相邻两个v值不同的p值之差绝对值之和. 分析 in a row原来是相邻的意思. 对于每个相同v值的块来说,有用的数只有 ...

  8. Django学习day1——Django的简单介绍

    1.了解Web基本的开发 使用Python开发Web,最简单,原始和直接的办法是使用CGI标准现在从应用角度解释它是如何工作: 首先做一个Python脚本,输出HTML代码,然后保存成.cgi扩展名的 ...

  9. 重邮二进制群-pwn1

    给学弟们练手的题目,做的过程中接触一些基本概念 #include <stdio.h> #include <unistd.h> int main() { ]; welcome() ...

  10. LVS 十种算法

    LVS虚拟服务器是章文嵩在国防科技大学就读博士期间创建的,LVS可以实现高可用的.可伸缩的网络服务. LVS集群组成: 前端:负载均衡层  (一台或多台负责调度器构成) 中间:服务器群组层  (由一组 ...