题意:
一个二维平面上有些点有权值。
问给你一个H*W的窗口,问窗口星星亮度总和的最大值。
H∗W范围:1e6H*W 范围:1e6H∗W范围:1e6
坐标范围:1e9坐标范围:1e9坐标范围:1e9
星星数目:1e4星星数目:1e4星星数目:1e4

题解:
我们考虑一维的情况。
假设一个序列aaa,给你你最多可以选择连续长度为lenlenlen序列段,问可以选择出最大的序列和为多少。
我们可以将这个(单点修改,区间查询)的问题给转换成,(区间修改,单点查询)问题。
初始化一个新数组bbb为0
对于第iii个值来说,我们把bbb的第iii到第i+leni+leni+len的值加上a[i]a[i]a[i]
然后查询b序列的最大值即为答案

同理我们可以得出在二维平面上的结论。
那么我们把该点(i,j)(i,j)(i,j)权值,在[(i,i+W),(j,j+H)][(i,i+W),(j,j+H)][(i,i+W),(j,j+H)]的范围内每个点都加上。然后就是查询这个新生成矩阵的最大值的点是哪个即可。

如何查询?
扫描线。
说是扫描线,不过这个扫描线是统计最大值点的,并不是统计面积的。
所以原来扫描线的模板不可以照搬。
也可以理解为线段树+离散化。

还有需要灵活处理的一点就是边框上的点是算不进去的,那你把窗口的长宽各减去1即可。

比较坑的一点:对 x 坐标进行升序排序时,将 val 值按降序排序,这样才能处理两个矩形贴合的情况。

代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;const int maxn=4e5;struct L{int x;int y1,y2;int flag;bool operator <(const L & a)const{if(x!=a.x) return x<a.x;else return flag>a.flag;}
}line[maxn];int v[maxn];
int tree[maxn],lazy[maxn];
void push_down(int node){if(lazy[node]){tree[node<<1]+=lazy[node];tree[node<<1|1]+=lazy[node];lazy[node<<1]+=lazy[node];lazy[node<<1|1]+=lazy[node];lazy[node]=0;}
}void update(int node,int start,int ends,int l,int r,int val){if(l<=start&&ends<=r){tree[node]+=val;lazy[node]+=val;return;}push_down(node);int mid=(start+ends)>>1;if(l<=mid) update(node<<1,start,mid,l,r,val);if(mid<r) update(node<<1|1,mid+1,ends,l,r,val);tree[node]=max(tree[node<<1],tree[node<<1|1]);
}signed main(){ios::sync_with_stdio(false);cin.tie(0);int t;cin>>t;while(t--){int n,h,w;cin>>n>>w>>h;for(int i=1;i<=n;i++){int x,y,z;cin>>x>>y>>z;int x1=x+w-1;int y1=y+h-1;v[i]=y,v[i+n]=y1;line[i]={x,y,y1,z};line[i+n]={x1,y,y1,-z};}sort(v+1,v+1+2*n);sort(line+1,line+1+2*n);int tot=unique(v+1,v+1+2*n)-v-1;for(int i=1;i<=2*n;i++){int x=lower_bound(v+1,v+tot+1,line[i].y1)-v;int y=lower_bound(v+1,v+tot+1,line[i].y2)-v;line[i].y1=x;line[i].y2=y;}int ans=0;for(int i=1;i<=2*n;i++){update(1,1,tot,line[i].y1,line[i].y2,line[i].flag);ans=max(ans,tree[1]);}memset(tree,0,sizeof tree);memset(lazy,0,sizeof lazy);cout<<ans<<endl;}
}

P1502 窗口的星星 离散化+扫描线相关推荐

  1. P1502 窗口的星星(扫描线入门第一题)

    题目链接:https://www.luogu.org/problem/P1502 P1502 窗口的星星 提交2.78k 通过682 时间限制1.00s 内存限制125.00MB 提交代码加入收藏 题 ...

  2. Luogu P1502 窗口的星星 (扫描线)

    Description 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户. 天真的小卡总是希望能够在晚上能看到最多最亮的星星,但是窗子的大小是固定的, ...

  3. P1502 窗口的星星题解(扫描线)

    知识点:线段树+扫描线 看了看这道题的x,y的数据范围,固定离散化. 注意避坑,方框上的不算. 题目的大致意思是给若干个点,然后给个方框求怎么框才能框柱尽可能多的星星. 我们要使用扫描线的时候通常是求 ...

  4. P1502 窗口的星星

    第一道扫描线+线段树题. 这道题还耗了我很久的时间,因为不懂得扫描线到底要怎么做而一直翻了很多dalao的题解. 这道题求的是一个指定大小的矩形可以框住多少颗星星,他们的亮度总和最大. 直接移动矩形不 ...

  5. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  6. 题解报告——窗口的星星

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

  7. POJ 1177 Picture [离散化+扫描线+线段树]

    http://poj.org/problem?id=1177 给若干矩形,求被覆盖的区域的周长. 将 y 坐标离散化后,按 x 坐标进行扫描.用线段树维护两个东西,当前竖线的叠加长度 len 和 条数 ...

  8. HDU 1542 Atlantis 线段树+离散化+扫描线

    题意:给出一些矩形的最上角坐标和右下角坐标,求这些矩形的面积并. NotOnlySuccess 线段树专辑中扫描线模板题,弱智的我对着大大的代码看了一下午才搞懂. 具体见思路见注释=.= #inclu ...

  9. poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长

    Picture 题意:求矩形面积并额轮廓长 解法:扫描线+离散化+线段树 做法:等于更新操作前后的tree[1].len差,做法这么巧妙实际我也不知道为什么.差不多的意思就是更新操作的cover变化长 ...

最新文章

  1. mysql 支持 pdo_使php支持pdo_mysql_睿合科技
  2. C++——可变模板参数
  3. VMware vSphere HA深入解析
  4. 剖析供应链攻击的防范
  5. 谷歌测试工程师分享前端性能监控利器Performance
  6. java赋值兼容原则,多态问题抛出(赋值兼容性原则遇上父类与子类同名函数的时候)...
  7. 计算机bios设置系统安装教程,U盘装系统BIOS设置教程进行设置图文教程
  8. 『开源项目』基于STM32的智能垃圾桶之语音播报
  9. 【sketchup 2021】草图大师的场景优化工具3【新建材质、材质编辑面板的详细说明】【重要】
  10. Android 闹钟设置最新版
  11. Win10 - 使用‘Alt+Tab’不能切换窗口及更改切换风格
  12. 阴阳师哪个服务器可以用微信登录,网易大神怎么绑定阴阳师QQ微信账号 网易大神绑定阴阳师QQ微信账号方法...
  13. 傻白入门芯片设计,wafer/die/chip/cell(一)
  14. 台式计算机硬盘英寸,台式电脑硬盘和笔记本电脑硬盘有区别吗?台式机硬盘报价一般是多少?...
  15. 编程小白的计算机毕业设计指导开发教程-javaweb i18n国际化的使用
  16. 电子商务网站设计的艺术
  17. SUN公司Java认证和考试纵览
  18. TCP与UDP的区别是什么?
  19. 优化器介绍—SGD、Adam、Adagrad
  20. 2014年至今参与的五个项目总结

热门文章

  1. TCP和UDP应用场景
  2. ospf的四种网络类型
  3. Dropout 的前世与今生
  4. 史上最强:numpy实现全部机器学习算法
  5. 从零开始实现穿衣图像分割完整教程(附python代码演练)
  6. 溢出漏洞利用小结(基础)
  7. JDK, JRE和JVM的区别与联系
  8. 4、EIGRP配置实验之手动汇总
  9. [Java]JDBC操作MySQL数据库
  10. 网络工程师职业发展解读