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. 第一天的题目 简单A+B 植树问题 多项式的值

    #include<stdio.h> int main() { int a=0;b=0; scanf("%d%d",&a,&b); printf(&quo ...

  2. BootCDNApi使用记录

    通过API获取BootCDN所加速的所有前端开源库的基本信息和文件列表 API 将一下API链接中的.min字样去掉后,获取到的JSON格式的返回信息是经过良好的格式化的,便于查看. 所有开源库简要信 ...

  3. 最短路径算法 1.Floyed-Warshall算法

    这几周开始正式系统学习图论,新学期开始新的记录.由于二模和生物地理两门高考的临近,时间比较仓促,所以暂时跳过图论的(一)和(二),即图的储存和遍历.从最短路径算法学起,首先要学习的是Floyed-Wa ...

  4. 44- EF + Identity实现

    1-配置EF, 需要创建如下几个类 默认User主键为guid类型,现在改成int类型 namespace MvcCookieAuthSample.Models { public class Appl ...

  5. VS2017 远程调试小记

    VS2017 远程调试小记 支持windows\linux\macos, 直接连接项目点的上线版本代码进行调试.保证bug在同个环境下实时追踪. 注意点 双方的 msvsmon.exe版本需一致,最好 ...

  6. Error loading MySQLdb module: libmysqlclient.so.18: cannot open shared object file: No such file or directory

    在hue上配置Mysql的时候,出现的错误:  发生服务器错误: Error loading MySQLdb module: libmysqlclient.so.18: cannot open sha ...

  7. OpenCV入门:(一:安装与配置)

    看到的不是自己的,只有写下来的才是自己的,上次接触OpenCV实在三个月前,亢奋的看完了OpenCV自带的入门文档,觉得对图形处理有了一点点了解,现在三个月过去了,由于学习需要,想深入了解OpenCV ...

  8. 今日Linux

    一.复习了vi 三个模式下的一些操作.贴上一些比较常用,个人觉得比较难记的操作.1.一般模式:h  光标向左移动一个字符j   光标向下移动一个字符K  光标向上移动一个字符l    光标向右移动一个 ...

  9. 手动监控Windows端口

    转载自http://blog.51cto.com/ywzhou/1579917 1.监控端口的几个主要Keys:   net.tcp.listen[port] Checks if this port  ...

  10. FlaskWeb开发从入门到放弃(二)

    第5章 章节五 01 内容概要 02 内容回顾 03 面向对象相关补充:metaclass(一) 04 面向对象相关补充:metaclass(二) 05 WTforms实例化流程分析(一) 06 WT ...