【洛谷 P1502】 窗口的星星(扫描线)
题目链接
把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形。
\(-0.5\)是因为边框上的不算。
离散化\(y\)坐标。
记录\(2n\)个\(4\)元组\((x,y1,y2,light)\),\(light\)指这颗星星的亮度,左正右负。
然后线段树每次在\([y1,y2]\)上加上\(light\),维护最大值即可。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define re register
using namespace std;
inline int read(){
re int s = 0, w = 1;
re char ch = getchar();
while(ch < '0' || ch > '9'){ ch = getchar(); if(ch == '-') w = -1; }
while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
return s * w;
}
const int MAXN = 100010 << 2;
struct lsh{
double val;
int id, type;
int operator < (const lsh A) const{
return val < A.val;
}
}p[MAXN];
struct node{
double x;
int y[2], light;
int operator < (const node A) const{
return x < A.x || x == A.x && light < A.light;
}
}q[MAXN];
int dat[MAXN], lazy[MAXN], n, w, h, T, num, tot, ans;
#define lc (now << 1)
#define rc (now << 1 | 1)
inline void pushup(int now){
dat[now] = max(dat[lc], dat[rc]);
}
inline void pushdown(int now){
if(lazy[now]){
lazy[lc] += lazy[now]; lazy[rc] += lazy[now];
dat[lc] += lazy[now]; dat[rc] += lazy[now];
lazy[now] = 0;
}
}
void update(int now, int l, int r, int wl, int wr, int p){
if(l >= wl && r <= wr){ lazy[now] += p; dat[now] += p; return; }
if(l > wr || r < wl) return;
pushdown(now);
int mid = (l + r) >> 1;
update(lc, l, mid, wl, wr, p);
update(rc, mid + 1, r, wl, wr, p);
pushup(now);
}
int main(){
T = read(); p[0].val = -233;
while(T--){
n = read(); w = read(); h = read(); num = tot = ans = 0;
for(int i = 1; i <= n; ++i){
q[i].x = read(); p[++num].val = read(); q[i].light = read();
p[num].id = i; p[num].type = 0;
p[++num].id = i; p[num].val = 1.0 * p[num - 1].val + h - 0.5; p[num].type = 1;
}
sort(p + 1, p + num + 1);
for(int i = 1; i <= num; ++i)
if(fabs(p[i].val - p[i - 1].val) > 1e-8)
q[p[i].id].y[p[i].type] = ++tot;
else q[p[i].id].y[p[i].type] = tot;
for(int i = 1; i <= n; ++i){
q[i + n] = q[i];
q[i + n].light *= -1;
q[i + n].x = 1.0 * q[i].x + w - 0.5;
}
n <<= 1;
sort(q + 1, q + n + 1);
for(int i = 1; i <= n; ++i){
update(1, 1, tot, q[i].y[0], q[i].y[1], q[i].light);
ans = max(ans, dat[1]);
}
printf("%d\n", ans);
memset(lazy, 0, sizeof lazy); memset(dat, 0, sizeof dat);
}
}
【洛谷 P1502】 窗口的星星(扫描线)的更多相关文章
- 洛谷p1502窗口的星星 扫描线
题目链接:https://www.luogu.org/problem/P1502 扫描线的板子题,把每个点看成矩形,存下边(x,y,y+h-1,li)和(x+w-1,y,y+h-1),在按横坐标扫线段 ...
- 洛谷 P1502 窗口的星星 解题报告
P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...
- luogu P1502 窗口的星星
题目链接 P1502 窗口的星星 题解 扫描线+线段树 线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小 按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围 维护扫描 ...
- 洛谷.T21778.过年(线段树 扫描线)
题目链接或者这吧.. 被数据坑了 /* 操作按左端点排个序 依次进行即可 不是很懂 为什么不写Build 而在Add时改mp[rt]=p 会WA(too short on line 251..) 找到 ...
- BZOJ1227或洛谷2154 [SDOI2009]虔诚的墓主人
BZOJ原题链接 洛谷原题链接 又是扫描线,题解可看大佬的博客(太懒了不想打) #include<cstdio> #include<algorithm> using names ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- 洛谷 P4125 [WC2012]记忆中的水杉树【扫描线+set+线段树】
我没有找到能在bzojAC的代码--当然我也WA了--但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的-- 首先看第二问, ...
- [POJ2823][洛谷P1886]滑动窗口 Sliding Window
题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...
- 【洛谷P1886】滑动窗口——单调队列
没想到啊没想到,时隔两个月,我单调队列又懵了…… 调了一个小时,最后错在快读,啊!!!!(不过洛谷讨论真好啊,感谢大佬!) 考前就不推新东西了,好好写写那些学过的东西 题目点这里(我就不粘了自己点一下 ...
随机推荐
- 给新建的kvm虚拟机创建网络接口
(一)首先必须创建网卡连接桥接口的启动脚本和停止脚本,其中脚本中的 $1:表示为虚拟机的网卡的右边接口,这两个脚本就是讲虚拟机的网卡的右边接口接在网桥上,实现桥接模型 # 1:/etc/qem ...
- Delphi中的DBGrid控件
在Delphi中,DBGrid控件是一个开发数据库软件不能不使用的控件,其功能非常强大,可以配合SQL语句实现几乎所有数据报表的显示,操作也非常简单,属性.过程.事件等都非常直观,但是使用中,有时侯还 ...
- [LeetCode] MaximumDepth of Binary Tree
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- Centos7安装完毕后联网-设置ip地址(VMware虚拟机)
VMware虚拟机中安装了Centos7,为了让Centos能够访问外网及设置固定的ip地址以方便本地通过SSH访问Centos,做以下几步.本文来自osfipin note. 1.确认虚拟机网络链接 ...
- 第155天:canvas(二)
一.添加样式和颜色 在前面的绘制矩形章节中,只用到了默认的线条和颜色. 如果想要给图形上色,有两个重要的属性可以做到. fillStyle = color 设置图形的填充颜色 strokeSt ...
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载
原文地址:http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.goog ...
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...
- Day22-session
1. cookie: 保存在用户浏览器端的一个键值对.基于cookie做用户验证的时候,不适合把敏感信息放到cookie中.例如我们可以把user_id这个不敏感的信息放到cookie中,然后基于us ...
- 快速傅里叶变换FFT / NTT
目录 FFT 系数表示法 点值表示法 复数 DFT(离散傅里叶变换) 单位根的性质 FFT(快速傅里叶变换) IFFT(快速傅里叶逆变换) NTT 阶 原根 扩展知识 FFT 参考blog: 十分简明 ...
- NOIP2015Day1T3斗地主(DFS)
这类题...真的写不动T T 首先可以发现没有顺子的话出牌次数是一定的, 换句话说只有顺子会影响出牌次数. 所以可以暴搜出所有顺子的方案, 搜完之后记忆化搜索求一下a张1张同色牌, b张2张同色牌,c ...