P1502 窗口的星星

题目背景

小卡买到了一套新房子,他十分的高兴,在房间里转来转去。

题目描述

晚上,小卡从阳台望出去,“哇~~~~好多星星啊”,但他还没给其他房间设一个窗户,天真的小卡总是希望能够在晚上能看到最多最亮的星星,但是窗子的大小是固定的,边也必须和地面平行。这时小卡使用了超能力(透视术)知道了墙后面每个星星的位置和亮度,但是小卡发动超能力后就很疲劳,只好拜托你告诉他最多能够有总和多亮的星星能出现在窗口上。

输入输出格式

输入格式:

本题有多组数据,第一行为\(T\)表示有T组数据\(T \le 10\)

对于每组数据

第一行\(3\)个整数\(n\),\(W\),\(H\),\((n \le 10000,1 \le W,H \le 1000000)\) 表示有 \(n\) 颗星星,窗口宽为 \(W\),高为 \(H\)。

接下来\(n\)行,每行三个整数 \(x_i\),\(y_i\) ,\(l_i\) 表示星星的坐标在\((x_i,y_i)\),亮度为\(l_i\)。\((0 \le l_i,x_i,y_i<2^{31})\)

输出格式:

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

说明

小卡买的窗户框是金属做的,所以在边框上的不算在内。


说明的意思等价于把\(w--,h--\)然后做闭区间,不是\(-=2\)的原因是窗口可以不在整数点上

我们把矩形左上角视为矩形的位置,然后对每个星星,我们都有一个区域满足当矩形落在这个区域时,可以得到这个星星的亮度

也就是我们在所有星星的区域构成的集合中取一点得到最大的亮度之和

可以拿扫描线维护这个操作,要求维护区间加和全局最大值

因为是第一次写扫描线,所以犯了一个错误供大家借鉴借鉴

对扫描线多元组排序时,若\(x\)坐标相等时,先执行撤销操作(如果是对每个点先操作再询问的话)


Code:

#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
const int N=2e4+10;
map <int,int > dx,dy;
int px[N],py[N],shine[N],n,m,w,h,nx,ny;
struct node
{
int x,up,dow,shine;
bool friend operator <(node n1,node n2)
{
return n1.x==n2.x?n1.shine<n2.shine:n1.x<n2.x;
}
}line[N];
void init()
{
dx.clear(),dy.clear();
scanf("%d%d%d",&n,&w,&h);//个数、长、宽
--w,--h;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",px+i,py+i,shine+i);
dx[px[i]]=1,dy[py[i]]=1;
dx[px[i]-w]=1,dy[py[i]-h]=1;
}
nx=0,ny=0;
for(map <int,int >::iterator it=dx.begin();it!=dx.end();it++)
it->second=++nx;
for(map <int,int >::iterator it=dy.begin();it!=dy.end();it++)
it->second=++ny;
m=0;
for(int i=1;i<=n;i++)
{
line[++m]={dx[px[i]]+1,dy[py[i]-h],dy[py[i]],-shine[i]};
line[++m]={dx[px[i]-w],dy[py[i]-h],dy[py[i]],shine[i]};
}
sort(line+1,line+1+m);
}
int lazy[N<<2],mx[N<<2];
#define ls id<<1
#define rs id<<1|1
void pushdown(int id)
{
if(lazy[id])
{
lazy[ls]+=lazy[id],lazy[rs]+=lazy[id];
mx[ls]+=lazy[id],mx[rs]+=lazy[id];
lazy[id]=0;
}
}
void updata(int id)
{
mx[id]=max(mx[ls],mx[rs]);
}
void change(int id,int l,int r,int L,int R,int delta)
{
if(l==L&&r==R)
{
lazy[id]+=delta;
mx[id]+=delta;
return;
}
pushdown(id);
int Mid=L+R>>1;
if(r<=Mid) change(ls,l,r,L,Mid,delta);
else if(l>Mid) change(rs,l,r,Mid+1,R,delta);
else change(ls,l,Mid,L,Mid,delta),change(rs,Mid+1,r,Mid+1,R,delta);
updata(id);
}
void work()
{
memset(mx,0,sizeof(mx));
memset(lazy,0,sizeof(lazy));
int ans=0;
for(int i=1;i<=m;i++)
{
change(1,line[i].up,line[i].dow,1,ny,line[i].shine);
ans=max(ans,mx[1]);
}
printf("%d\n",ans);
}
int main()
{
int t;scanf("%d\n",&t);
while(t--)
init(),work();
return 0;
}

2018.8.31

洛谷 P1502 窗口的星星 解题报告的更多相关文章

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

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

  2. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  3. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  4. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  5. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  6. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  7. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  8. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  9. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

随机推荐

  1. IO复用——epoll系列系统调用

    1.内核事件表 epoll是Linux特有的I/O复用函数.epoll把用户关心的文件描述上的事件放在内核里的一个事件表中,并用一个额外的文件描述符来标识该内核事件表.这个额外文件描述符使用函数epo ...

  2. Spring 的好处?

    1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监 ...

  3. 20145202马超 2016-2017-2 《Java程序设计》第四周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 继承:打破了封装性 extends 1.提高了代码的复用性. 2.让类与类之间产生了关系 ...

  4. malloc分配失败的两个现象

    在实际代码中,malloc的反复分配释放,可能会导致某一次malloc分配失败,虽然上一次调用malloc分配成功(然后释放),下一次在相同地方调用malloc分配可能会失败,疑问在于,既然上一次分配 ...

  5. 【数据库】 SQL 使用注意点

    [数据库] SQL 使用注意点 一. 索引 1. 常用的搜索条件,都建议加上索引,但状态列除外(该列只有0,1或几个值,不需要加索引,因为没效果) 2. 查询时, 索引列不能做函数处理,会不走索引 3 ...

  6. windows10安装liux系统

    1.前言 因为大部分服务器都是linux系统,需要掌握linux命令行和熟悉linux环境,所以自己用为数不多的工资买了新电脑,就是为了学习linux系统,此文是为了记载自己在windows系统上安装 ...

  7. 通过调用API在JavaWeb项目中实现证件识别

    本文详细介绍自己如何在JavaWeb项目中通过调用API实现证件识别. 一,Face++使用简介 二,两种方式(图片URL与本地上传)实现证件识别 一,Face++使用简介 Face++旷视人工智能开 ...

  8. Qt 实时读串口数据,并将读到的数据从网口发送出去

    需求: 1. 要试试从串口读取数据 2. 将读到的数据从网口发送出去 3.开机启动 4. 没有界面 第一部分 配置Qt Pro文件  需要Qt += serialport network 第二部分 - ...

  9. Qt irrlicht(鬼火)3D引擎 摄像机旋转问题

    点击打开链接Irrlicht中的摄像有一个函数 setUpVector() if (m_device != 0 ) { core::vector3df rotation(y,x,0.f); m_cam ...

  10. kickstart技术安装操作系统

    kickstart是RedHat公司开源的软件,所以对CentOS兼容性最好. 原理:我们将手动安装的所有的详细步骤记录到一个文件中,然后kickstart通过读取这个文件就可以实现自动化安装系统. ...