Description
晚上,小卡从阳台望出去,“哇~~~~好多星星啊”,但他还没给其他房间设一个窗户。

天真的小卡总是希望能够在晚上能看到最多最亮的星星,但是窗子的大小是固定的,边也必须和地面平行。

这时小卡使用了超能力(透视术)知道了墙后面每个星星的位置和亮度,但是小卡发动超能力后就很疲劳,只好拜托你告诉他最多能够有总和多亮的星星能出现在窗口上。

Input
本题有多组数据,第一行为 TTT,表示有 TTT组数据。
对于每组数据:
第一行 333 个整数 n,W,Hn,W,Hn,W,H 表示有 nnn 颗星星,窗口宽为 WWW,高为 HHH。
接下来 nnn 行,每行三个整数xi,yi,lix_i, y_i, l_ixi​,yi​,li​ 表示星星的坐标在 (xi,yi)(x_i,y_i)(xi​,yi​) 亮度为lil_ili​

Output
T 个整数,表示每组数据中窗口星星亮度总和的最大值。

Examples
Input
2
3 5 4
1 2 3
2 3 2
6 3 1
3 5 4
1 2 3
2 3 2
5 3 1

Output
5
6

1 <= T <= 10
1 <= n <= 1e4
1<=W,H<=1e61 <= W, H <= 1e61<=W,H<=1e6 0<=xi,yi<0 <= x_i, y_i <0<=xi​,yi​< 2312^{31}231

Solution
以每个星星为右下角,形成宽为W 高为H的矩阵。
可知窗口的右上角必须严格位于该星星的矩阵中才可获得该星星的权值
于是可以用扫描线,用线段树维护区间的点内的最大值

Hint
对扫描线按照纵坐标排序时,若纵坐标相同,矩形的下底边(区间加)需要排在前面,才能保证答案的正确性
因为一般的扫描线都是处理线段的,而这里本质上是离散的点,所以需要区分开来

Code

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int MX = 2e5 + 7;int n,w,h, X[MX << 1];
struct Scanline{int l,r,h;int mark;bool operator< (const Scanline&it) const{if(h == it.h) return mark > it.mark;return h < it.h;}
}line[MX << 1];struct Segtree{int l,r,lazy,maxn;
}t[MX << 3];
void build(int rt,int l,int r){t[rt].l = l, t[rt].r = r;t[rt].lazy = t[rt].maxn = 0;if(l == r) return ;int mid = (l + r) >> 1;build(ls,l,mid);build(rs,mid+1,r);
}void push_up(int rt){t[rt].maxn = max(t[ls].maxn,t[rs].maxn);
}void push_down(int rt){if(t[rt].l != t[rt].r){t[ls].maxn += t[rt].lazy;t[ls].lazy += t[rt].lazy;t[rs].maxn += t[rt].lazy;t[rs].lazy += t[rt].lazy;} t[rt].lazy = 0;
}
void update(int rt,int L,int R,int k){int l = t[rt].l, r = t[rt].r;if(L <= X[l] && X[r] <= R){t[rt].maxn += k;t[rt].lazy += k;return ;}push_down(rt);int mid = (l + r) >> 1;if(L <= X[mid]) update(ls,L,R,k);if(R > X[mid]) update(rs,L,R,k);push_up(rt);
}int main(){int T;scanf("%d",&T);while(T--){scanf("%d %d %d",&n,&w,&h);for(int i = 1;i <= n;++i){//(x,y) (x + w - 1, y + h - 1)int x,y,k;scanf("%d %d %d",&x,&y,&k);int x1 = x, x2 = x + w - 1;int y1 = y, y2 = y + h - 1;X[i * 2 - 1] = x1, X[i * 2] = x2;line[i * 2 - 1] = (Scanline){x1,x2,y1,k};line[i * 2] = (Scanline){x1,x2,y2,-k};}n <<= 1;sort(line + 1, line + n + 1);sort(X + 1,X + n + 1);int tot = unique(X + 1,X + 1 + n) - X - 1;build(1,1,tot);int res = 0;for(int i = 1;i <= n;++i){update(1,line[i].l,line[i].r,line[i].mark);res = max(res,t[1].maxn);}printf("%d\n",res);}
}
/*
1
2 5 4
1 2 3
5 3 11
2 5 4
1 2 3
1 5 1
*/

Luogu P1502 窗口的星星 (扫描线)相关推荐

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

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

  2. P1502 窗口的星星 离散化+扫描线

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

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

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

  4. P1502 窗口的星星

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

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

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

  6. 【数据结构2-2】线段树与树状数组 题解

    头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...

  7. 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列

    第47章     QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...

  8. 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列

    第47章     QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...

  9. (详细)星空动态特效(基于C语言+EasyX库实现)

    1.程序运行环境(必读)                      Visual C++ 6.0.Visual Studio 2010 ~ Visual Studio 2022 等支持EasyX图形库 ...

最新文章

  1. 让Ubuntu拥有SUSE一样的GRUB启动界面
  2. 计算机史最疯狂一幕:豪赌50亿美元,“蓝色巨人”奋身一跃
  3. Socket笔记【转】
  4. 由浅入深:自己动手开发模板引擎——置换型模板引擎(四)
  5. 求有环单链表的环连接点位置
  6. MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?
  7. Ubuntu:Ubuntu系统下在pycharm软件内配置anaconda环境(一张图轻松搞定!)
  8. 让你觉得破坏了封装性的扩展方法
  9. 【Linux】一步一步学Linux——passwd命令(85)
  10. Java Mission Control 5.2终于来了! 欢迎7u40!
  11. Springboot + Mybatis + Ehcache
  12. WinSCP断线,WinSCP总是断线,断线重连过程又需要卡很长时间解决办法
  13. java密码查询回显和修改流程_[求助]数据库信息如何回显在我的程序界面中
  14. Animator 的总结
  15. 程序猿趣图几张,第一张就亮瞎了..
  16. 华为交换机关闭网口_华为交换机如何关闭网络端口号
  17. 帆软 在线Cron表达式
  18. 外点惩罚函数法matlab程序例子,外点罚函数优化实例.doc
  19. DAX: 用SWITCH函数替换嵌套IF函数
  20. Java-(二)微信小程序授权获取用户信息和手机号码

热门文章

  1. 新电脑使用老微软账号登录就显示office2016已激活,但是新电脑的office2021未兑换
  2. ANDORID~支持的设备
  3. 一起典型的人机环境系统事故
  4. JavaFX使用自定义字体
  5. Java获取中文汉字拼音首字母方法一(更快速)
  6. Windows系统切换工具 算法分析+注册机
  7. Speedoffice(excel)如何使用COUNTIF函数进行条件计数
  8. 释放被系统保留的内存容量
  9. 5.2 递归算法及设计思想
  10. image 图片生产XPS文件