洛谷p1502窗口的星星 扫描线
题目链接:https://www.luogu.org/problem/P1502
扫描线的板子题,把每个点看成矩形,存下边(x,y,y+h-1,li)和(x+w-1,y,y+h-1),在按横坐标扫线段更新y区间,线段树维护区间最大值
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define maxn 20005
struct seg{
ll x,l,r,s,val;
seg(){}
seg(ll x,ll l,ll r,ll s,ll val):x(x),l(l),r(r),s(s),val(val){};
bool operator <(const seg &w)const{
if(x==w.x)return s>w.s;
return x<w.x;
}
}se[maxn<<];
struct node{
ll x,y,val,x1,y1;
}a[maxn<<];
ll n,w,h,ly[maxn<<],ny;
ll sum[maxn<<],lazy[maxn<<];
void pushup(int rt)
{
sum[rt]=max(sum[rt<<],sum[rt<<|]);
}
void build(int l,int r,int rt)
{
sum[rt]=lazy[rt]=;
if(l==r)
{
return ;
}
int mid=l+r>>;
build(ls);build(rs);
pushup(rt);
}
void pushdown(int rt)
{
if(lazy[rt])
{
sum[rt<<]+=lazy[rt];
sum[rt<<|]+=lazy[rt];
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void update(int L,int R,int val,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
sum[rt]+=val;
lazy[rt]+=val;
return ;
}
pushdown(rt);
int mid=l+r>>;
if(L<=mid)update(L,R,val,ls);
if(R>mid)update(L,R,val,rs);
pushup(rt);
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>w>>h;
int cnt=;
for(int i=;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].val;
a[i].y1=a[i].y+h-;
ly[++cnt]=a[i].y;ly[++cnt]=a[i].y+h-;
se[cnt-]=seg(a[i].x,a[i].y,a[i].y1,,a[i].val);
se[cnt]=seg(a[i].x+w-,a[i].y,a[i].y1,-,a[i].val);
}
sort(ly+,ly++cnt);
sort(se+,se++cnt);
ny=unique(ly+,ly++cnt)-ly-;
build(,ny,);
int l,r;
ll ans=;
for(int i=;i<=cnt;i++)
{
l=lower_bound(ly+,ly++ny,se[i].l)-ly;
r=lower_bound(ly+,ly++ny,se[i].r)-ly;
if(se[i].s==)update(l,r,se[i].val,,ny,);
else update(l,r,-se[i].val,,ny,);
ans=max(ans,sum[]);
}
cout<<ans<<endl;
}
return ;
}
洛谷p1502窗口的星星 扫描线的更多相关文章
- 洛谷 P1502 窗口的星星 解题报告
P1502 窗口的星星 题目背景 小卡买到了一套新房子,他十分的高兴,在房间里转来转去. 题目描述 晚上,小卡从阳台望出去,"哇~~~~好多星星啊",但他还没给其他房间设一个窗户, ...
- luogu P1502 窗口的星星
题目链接 P1502 窗口的星星 题解 扫描线+线段树 线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小 按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围 维护扫描 ...
- 【洛谷 P1502】 窗口的星星(扫描线)
题目链接 把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形. \(-0.5\)是因为边框上的不算. 离散化\(y\)坐标. 记录\(2n\)个\(4\)元组\((x,y1 ...
- 洛谷.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】滑动窗口——单调队列
没想到啊没想到,时隔两个月,我单调队列又懵了…… 调了一个小时,最后错在快读,啊!!!!(不过洛谷讨论真好啊,感谢大佬!) 考前就不推新东西了,好好写写那些学过的东西 题目点这里(我就不粘了自己点一下 ...
随机推荐
- P1068 压缩技术
题目描述 设某汉字由N × N的0和1的点阵图案组成. 我们依照以下规则生成压缩码.连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下.第一个数表示连续有几个0,第二 ...
- H3C IPv6邻居发现协议
- H3C CIDR
- 机器学习——集成学习之Boosting
整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 AdaBoost GB ...
- H3C端口绑定技术简介
- 安装低版本Microsoft .NET Framework 4.5受阻解决方案
在VS目标框中找不到Microsoft .NET Framework 4.5,项目出错,安装受阻.... 1.Microsoft .NET Framework 安装了高版本后,低版本通过网上上下载的d ...
- c++ CArray函数
CArray属于MFC,是一个数组模板类.MFC的数组类支持的数组类似于常规数组,可以存放任何数据类型.常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,即先确定大小,而MFC数组类创建的对象 ...
- Linux 命令整理 vim
Vim 一.官方网站 http://www.vim.org 二.背景 所有的 Unix Like 系统都会内建 vi 文书编辑器,但是在我们编程这里开发使用最多的要数 vim命令了. 三.操作 三种 ...
- vue基础用法
vue.js是什么 vue.js也称为vue,读音/vju/ 是一个构建用户界面的框架 是一个轻量级MVVM(Model-view-viewModel)框架,和angular,react类似,其实就是 ...
- Webpack4不求人系列(1)
Webpack是一个现在Javascript应用程序的模块化打包器,在Webpack中JS/CSS/图片等资源都被视为JS模块,简化了编程.当Webpack构建时,会递归形成一个模块依赖关系图,然后将 ...