洛谷 P1502 窗口的星星 解题报告
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 窗口的星星 解题报告的更多相关文章
- 洛谷p1502窗口的星星 扫描线
题目链接:https://www.luogu.org/problem/P1502 扫描线的板子题,把每个点看成矩形,存下边(x,y,y+h-1,li)和(x+w-1,y,y+h-1),在按横坐标扫线段 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...
随机推荐
- 总结laravel假数据填充步骤
定义好模型 xxx.php 定义好数据生成的规则 database/factories/XxxlFactory.php 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 databas ...
- JQ 封装全选函数
单击时触发效果: 如果有一个没有选中把全选的勾去了,如果select所有的都选中了,那就把全选勾上 html里: <div class="row cl"> <la ...
- Hadoop(13)-MapReduce框架原理--Job提交源码和切片源码解析
1.MapReduce的数据流 1) Input -> Mapper阶段 这一阶段的主要分工就是将文件切片和把文件转成K,V对 输入源是一个文件,经过InputFormat之后,到了Mapper ...
- SSM框架搭建步骤
首先要导入相关的jar包(spring\spring-core\spring-jdbc\spring-aop\spring-context\spring-webmvc\junit\commons-la ...
- GDOI DAY1游记
今天,是本蒟蒻的第一次参加GDOI,真激动! 今天,是GDOI第一天,昨天熬夜打代码,今天早上状态十分不好,于是... 进入了考场,叫我们自由打一会代码,于是...打了一坨AC机,重要的是错了(额.. ...
- 形象的理解Strong和Weak
Strong Weak
- RevealTrans图片切换效果
RevealTrans 更新时间:2013-06-01 17:11:59 | RevealTrans兼容性:IE5.5+ 语法: filter : progid:DXImageTransform.Mi ...
- es2017中的async和await要点
1. async和await最关键的用途是以同步的写法实现了异步调用,是对Generator异步方法的简化和改进.使用Generator实现异步的缺点如下: 得有一个任务执行器来自动调用next() ...
- shiro笔记
控制某一角色拥有此选项 上图 标签为shiro:hasRole表示 此时只有admin角色才拥有 系统用户管理和角色管理两个tab 页 上图 标签为shiro:hasPermission表示 此时只有 ...
- python基础篇 05字典
本节主要内容:1. 字典的简单介绍2. 字典增删改查和其他操作3. 字典的嵌套 一. 字典的简单介绍:字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中 ...