【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】窗口的星星的更多相关文章
- luogu P1502 窗口的星星
题目链接 P1502 窗口的星星 题解 扫描线+线段树 线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小 按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围 维护扫描 ...
- 洛谷 P1502 窗口的星星 解题报告
P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...
- 洛谷p1502窗口的星星 扫描线
题目链接:https://www.luogu.org/problem/P1502 扫描线的板子题,把每个点看成矩形,存下边(x,y,y+h-1,li)和(x+w-1,y,y+h-1),在按横坐标扫线段 ...
- 【Luogu P1502】 窗口的星星
→传送窗口 (复制一下题面好了~) 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,“哇~~~~好多星星啊”,但他还没给其他房间设一个窗户,天真的小 ...
- 【洛谷 P1502】 窗口的星星(扫描线)
题目链接 把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形. \(-0.5\)是因为边框上的不算. 离散化\(y\)坐标. 记录\(2n\)个\(4\)元组\((x,y1 ...
- 【louguP1502】窗口的星星
题目链接 用两条扫描线从左往右扫描,距离为W,右边的扫描线扫到就加上,左边的扫到就减去, 线段树上的一点\(x\)维护\((x,x+H)\)的星星总价值,修改时直接修改\((x-H,x)\)就行了 坐 ...
- luogu1502 窗口的星星
扫描线应该打懒标记的-- #include <algorithm> #include <iostream> #include <cstdio> using name ...
- Luogu1502 窗口的星星 (线段树扫描线)
将每个点拓展为矩形,将\(y\)离散,延\(x\)轴扫描,每次更新最值 用了一百年的pushdown操作疑似有问题,亦或这道题特殊,我乱改了pushdown位置就过了,我能怎么办,WA了一发,y数组没 ...
- 【学习笔记】线段树—扫描线补充 (IC_QQQ)
[学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...
随机推荐
- Java基础(十四)代理(Proxy)
1.为什么要使用代理 代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 假设有一个表示接口的Class对象(有可能只包含一个接口),它的确 ...
- CSAPP:代码优化【矩阵读写】
转载请注明出处:https://www.cnblogs.com/ustca/p/11790314.html 写程序最主要的目标就是使它在所有可能的情况下都正确工作,另一方面,在很多情况下,让程序运行得 ...
- (Java) Md5Utils
package com.vcgeek.hephaestus.utils; import java.security.MessageDigest; public class Md5Utils { /** ...
- CSP2019知识点整理
也算是接下来二十天的复习计划吧 仅止于联赛难度左右 基础算法 字符串 char[] cstring memset() 输入无& gets(), fgets(stdin, ,); strcmp, ...
- 网络安全-主动信息收集篇第二章-二层网络扫描之arping
arping二层网络发现 介绍工具:arping arping主要查看IP的MAC地址 缺点:工具本身只能ping一个IP地址,不能ping一个IP段.但是可以通过脚本将整个网络中的IP进行扫描. 脚 ...
- NOIP模拟测试40
考试时打了三个正解(或者叫能A的算法?),但是最终一个都没有A. 比较失败的一次考试. T1.队长快跑 先打了70分的dp,然后发现这个式子可以优化,拿线段树搞一下就好了,发现考试已经过去1h了,决定 ...
- js的ajax请求
1 js原生get请求 <script> window.onload = function(){ var oBtn = document.getElementById('btn'); oB ...
- windows下同时装了Python3和Python2,如何区分使用?
1.前言 想学习Python3,但是暂时又离不开Python2.在Windows上如何让它们共存呢? 目前国内网站经常会让大家把其中一个python.exe改个名字,这样区分开两个可执行文件的名字,但 ...
- [LLL邀请赛]参观路线(图论+dfs)
emmmm....学校的oj被查水表了,扒不到原题面,所以.... 但是我还是扒到了题面... 题目大意:给定一个完全图,删掉其中一些边,然后求其字典序最小的遍历顺序 有点像去年day2T1啊.... ...
- Go 基础学习笔记(3)| 第一个程序 “helloworld”
//第一个程序总要说的清楚才行. //建议先运行起第一个程序实践后,再看后面的具体解答 一.helloworld 编写运行 1.编写源程序,在 ~ /hello/src 编写hello.g ...