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. FastDFS轻量级分布式文件系统部署

    FastDFS介绍 FastDFS 是一个由 C 语言实现的开源轻量级分布式文件系统,作者余庆,支持 Linux.FreeBSD.AID 等 Unix 系统,解决了大数据存储和读写负载均衡等问题,适合 ...

  2. Kubernetes-DNS

    Kubernetes提供的虚拟DNS服务名为skydns,由四个组件组成: etcd:DNS存储 kube2sky:将Kubernetes Master中的Service(服务)注册到etcd sky ...

  3. SELECT(データ取得)

    WHERE 句は.満たすべき条件を指定することにより選択される行数を制限します. WHERE 句は.SELECT 命令と同様に OPEN CURSOR.UPDATE.および DELETE 命令でも使用 ...

  4. P1855 榨取kkksc03

    P1855 榨取kkksc03 题目描述 以下皆为真实的故事. 洛谷2的团队功能是其他任何oj和工具难以达到的.借助洛谷强大的服务器资源,任何学校都可以在洛谷上零成本的搭建oj并高效率的完成训练计划. ...

  5. LeetCode:17. Letter Combinations of a Phone Number(Medium)

    1. 原题链接 https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/ 2. 题目要求 给定一 ...

  6. sql插入查询出的数据,主键递增

    INSERT INTO C_DPRECORD SELECT (SEQ_C_DPRECORD.NEXTVAL ) AS ID, DEV_ID, DEV_CHNNUM, DEV_NAME, DEV_CHN ...

  7. Mysql双主操作

    MySQL双主(主主)架构方案   在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果 ...

  8. Android ImageSwitcher 配合Picasso解决内存溢出(OOM)问题

    最近项目中用到了 ImageSwitcher 来实现图片切换,使用起来很简单,但发现当图片比较大(超过了3M)时,程序出现了内存溢出(OOM)问题而崩溃了. 原因就是图片太大了,显示到 ImageVi ...

  9. [转]使用Gradle管理你的Android Studio工程

    本文转自:http://www.flysnow.org/2015/03/30/manage-your-android-project-with-gradle.html Gradle简介 Gradle  ...

  10. su: Authentication failure

    su: Authentication failure问题解决: su 命令切换失败,提示su: Authentication failure,只要你sudo passwd root过一次之后,下次再s ...