题目链接

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. Luogu1502 窗口的星星 (线段树扫描线)

    将每个点拓展为矩形,将\(y\)离散,延\(x\)轴扫描,每次更新最值 用了一百年的pushdown操作疑似有问题,亦或这道题特殊,我乱改了pushdown位置就过了,我能怎么办,WA了一发,y数组没 ...

  9. 【学习笔记】线段树—扫描线补充 (IC_QQQ)

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

随机推荐

  1. net.sf.json------json解析

    下载地址 [plain] view plain copy   本次使用版本:http://sourceforge.net/projects/json-lib/files/json-lib/json-l ...

  2. <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible' />

    代码一:<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> http-eq ...

  3. S折交叉验证(S-fold cross validation)

    S折交叉验证(S-fold cross validation) 觉得有用的话,欢迎一起讨论相互学习~Follow Me 仅为个人观点,欢迎讨论 参考文献 https://blog.csdn.net/a ...

  4. numpy中的arg系列函数

    numpy中的arg系列函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 不定期更新,现学现卖 numpy中arg系列函数被经常使用,通常先进行排序然后返回原数组特定的索引. argmax ...

  5. C语言复习---获取最大公约数(辗转相除法和更相减损法)

    源自:百度百科 辗转相除法 辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法. 例如,求(,): ∵ ÷=(余319) ∴(,)=(,): ∵ ÷=(余58) ∴(,)=( ...

  6. JVM调优命令-jps

    JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程. 命令格式 1 jps [options] [hostid] options参数-l : 输出主类全名或j ...

  7. 运算符,比如+, -, >, <, 以及下标引用[start:end]等等,从根本上都是定义在类内部的方法。

    python解释器在碰到+号运算符时,会调用加号前面的对象的__add__方法 class a: def __add__(self,b): print "ghh" aa=a() a ...

  8. springboot整合rabbitmq客户端连接报超时异常问题解决:An unexpected connection driver error occured java.net.SocketException: Socket Closed,java.util.concurrent.TimeoutException

    我用的是springboot2.0.6版本,对应的ampq也是2.0.6版本,然后启动一直报: 还有java.util.concurrent.TimeoutException, 用户授权什么的都对,很 ...

  9. imperva—waf 敏感字段显现

    imperva WAF中看到的日志内容信息有些都是敏感的  比如登录登出的信息 如何调整敏感信息的现实方式,并可以自定义敏感字段? 这里添加字段就可以了 这样就将******转变为明文了

  10. u_boot移植之内存基础知识DDR【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4938411.html