luogu P1502 窗口的星星

时间:2023-01-21 08:33:40

题目链接

P1502 窗口的星星

题解

扫描线+线段树

线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小

按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围

维护扫描线,扫到可以加某颗星星就把星星加进去,扫到该出来的时候就把星星搞出来,线段树维护一下

代码

#include<cstdio>
#include<cstring>
#include<algorithm> const int maxn = 100007; int n,w,h;
int pou[maxn << 2],T[maxn << 2],tag[maxn << 2]; struct P {
int x,y,l,k,ymax,id;
}star[maxn << 2];
inline bool cmp1(P a,P b) { return a.y < b.y; }
inline bool cmp2(P a,P b) { if(a.id == b.id) return a.k < b.k; return a.id < b.id; }
inline bool cmp3(P a,P b) { if(a.x == b.x) return a.k < b.k; return a.x < b.x; }
void pushdown(int x,int l,int r) {
if(!tag[x]) return;
if(l == r) { tag[x] = 0; return; }
int mid = l + r >> 1;
tag[x << 1] += tag[x]; tag[x << 1 | 1] += tag[x];
T[x << 1] += tag[x]; T[x << 1 | 1]+=tag[x];
tag[x] = 0;
} void modify(int x,int l,int r,int tl,int tr,int val){
pushdown(x,l,r);
if(tl <= l && r <= tr) {
tag[x] = val; T[x] += val;
return;
}
int mid = (l + r) >> 1;
if(tl <= mid) modify(x << 1,l,mid,tl,tr,val);
if(mid < tr) modify(x << 1 | 1,mid + 1,r,tl,tr,val);
T[x] = std::max(T[x << 1],T[x << 1 | 1]);
}
void init() {
memset(T,0,sizeof(T));
memset(tag,0,sizeof(tag));
scanf("%d%d%d",&n,&w,&h);
for(int x,y,l,i = 1;i <= n ;++ i) {
scanf("%d%d%d",&x,&y,&l);
star[i] = (P) {x, y, l, 1};
star[i + n] = (P){ x + w - 1, y, -l, 2};
star[i + (n << 1)].y = y + h - 1;
star[i + (n << 1)].k = 3;
star[i].id = star[i + n].id = star[i + (n << 1)].id = i;
}
} void solve() {
std::sort(star + 1,star + n * 3 + 1,cmp1);
int cnt = 0;
for(int i = 1;i <= n * 3;++ i) pou[i] = star[i].y;
for(int i = 1;i <= n * 3;++ i)
if(star[i].y == pou[i - 1]) star[i].y = star[i - 1].y;
else star[i].y =++ cnt;
std::sort(star + 1,star + n * 3 + 1,cmp2);
for(int i = 1;i <= n * 3;i += 3) star[i].ymax = star[i + 1].ymax = star[i + 2].y;
for(int i = 3;i <= n << 1;++ i) star[i] = star[i + ((i - 1) >> 1)];
std::sort(star + 1,star + (n << 1) + 1,cmp3);
int ans = 0;
for(int i = 1;i <= n << 1;++ i) {
modify(1,0,cnt,star[i].y,star[i].ymax,star[i].l);
ans = std::max(ans,T[1]);
}
printf("%d\n",ans);
return ;
}
int main() {
int t; scanf("%d",&t);
while(t --) {
init();
solve();
}
return 0;
}

luogu P1502 窗口的星星的更多相关文章

  1. 洛谷 P1502 窗口的星星 解题报告

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

  2. 洛谷p1502窗口的星星 扫描线

    题目链接:https://www.luogu.org/problem/P1502 扫描线的板子题,把每个点看成矩形,存下边(x,y,y+h-1,li)和(x+w-1,y,y+h-1),在按横坐标扫线段 ...

  3. 【Luogu P1502】窗口的星星

    Luogu P1502 题意很好理解,就是问给出的矩形套住的最大和. 但是做起来却十分麻烦. --来自疯狂爆10分的愤怒 一个比较高效的思路是--把每一个星星作为左下角向右上方拓展形成一个矩形, 拓展 ...

  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. 【学习笔记】线段树—扫描线补充 &lpar;IC&lowbar;QQQ&rpar;

    [学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...

  9. HGOI 20190218 题解

    /* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...

随机推荐

  1. zookeeper 安装及一些问题

    一.mac brew安装 http://blog.itpub.net/27099995/viewspace-1394831/ 二.部署多台 参考链接:http://blog.itpub.net/270 ...

  2. angular代码分析之异常日志设计

    angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...

  3. python解无忧公主数学题108

    """ python解无忧公主数学题108回文.py 题目来源: http://mp.weixin.qq.com/s?__biz=MzI5ODEwMDQyNw==&amp ...

  4. div 背景色设置&lowbar;DIV背景颜色设置

    DIV 背景色设置篇-div背景颜色设置篇 一.div标签内直接设置背景颜色   -   TOP <div style="background:#000; color:#FFF&quo ...

  5. Linux centos7环境下安装Nginx

    Linux centos7环境下安装Nginx的步骤详解 1.    首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...

  6. bootstrap表格 之多选数据的获取

    使用表格的时候经常会用到多选的功能,比较常用,下面写一个小Dome记录一下 如下:单击批量删除按钮之后,需要获取选中行数据,传值到后台进行处理 一.获取选择行的数据 btnplDel是按钮id:tab ...

  7. Asp&period;Net Core IIS发布后PUT、DELETE请求错误405&period;0 - Method Not Allowed 因为使用了无效方法&lpar;HTTP 谓词&rpar;

    一.在使用Asp.net WebAPI 或Asp.Net Core WebAPI 时 ,如果使用了Delete请求谓词,本地生产环境正常,线上发布环境报错. 服务器返回405,请求谓词无效. 二.问题 ...

  8. emacs 图解

    emacs 图解 =================== End

  9. Java精选笔记&lowbar;IO流&lpar;字符输入输出流、字符文件输入输出流、字符流的缓冲区&rpar;

    字符流 Reader是字符输入流的基类,用于从某个源设备读取字符 Writer是字符输出流,用于向某个目标设备写入字符 字符流操作文件 字符输入流FileReader,通过此流可以从关联的文件中读取一 ...

  10. MVC 事物同时保存,更新数据库

    本人小白一枚,第一次写博,主要用作笔记,怕以后忘记了,大神尙可路过,也可多多指教 事物用在同时保存更新数据时,及只要在事物块的范围内,有一个操作出错则事物块所有更新,保存等操作都不会执行        ...