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. CasperJS 前端功能测试

    CasperJS 是一个开源的导航脚本和测试组件.它提供实用的高级函数.方法和语法糖,可完成以下任务: 对浏览导航步骤的定义和排序 填写和提交表单 点击和跟踪链接 获取页面快照(或者页面中的某部分) ...

  2. 基于MVC的RESTful风格的实现

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  3. postman的监控接口响应时间monitor

    Monitor简介1.是基于Postman集合API的灵活监控 2.监控API的正常运行时间.响应能力和正确性 3.提供监测结果的详细报告 4.对所有Postman用户每月提供1000个免费的监控请求 ...

  4. 【已解决】ArcGIS Engine无法创建拓扑的问题(CreateTopology)

    也许,你的问题是这样的 ①System.Runtime.InteropServices.COMException:"未找到拓扑." ②myTopology结果是null,程序跳转到 ...

  5. 一位年轻而优秀的.NET开发者的成长点滴

    一,社区的小圈子 今年3月的一次技术交流活动上,那是我们.NET技术社区第一次组织线下活动,由于没什么经验,所以活动组织得比较仓促,内容也比较一般,效果还是有点欠缺.当然,活动本身是必要的,这次活动上 ...

  6. 《Effective Java》 读书笔记(九)使用try-with-resources 语句替代try-finally

    这一点其实深有感触.话不多说,先上代码: static String firstLineOfFile(String path) { BufferedReader bufferedReader = nu ...

  7. 安装ubuntu16虚拟机,下载android源码,配置编译环境

    Android 源码编译步骤: 我考虑了一下,目前电脑装了SSD,8G内存,使用虚拟机编译源码应该够用. 首先下载虚拟机软件,由于最近一直在使用virtualbox,感觉蛮不错了,下载地址: http ...

  8. mysql约束条件

    约束条件 (测试markdown 编辑器专用) null 允许为空 not null 不允许为空 key 键值类型 default 设置默认类型,缺省值为NULL extra 额外设置 CREATE ...

  9. NOIP模拟测试25

    这次考试后面心态爆炸了...发现刚了2h的T2是假的之后就扔掉了,草率地打了个骗分 T1只会搜索和m=0 最先做的T3,主要是发现部分分很多,当时第一眼看上去有87分(眼瞎了). 后来想了想,感觉一条 ...

  10. CSPS模拟 48

    ??? 分数越来越低??? T1 String Master 题目过于毒瘤,以至于我都不想改 T2 Tourist Attractions 稍微转化题意是求无向图的三角形个数 由于坚信bitset不是 ...