题意:

给出一大堆星星的坐标,给出每个星星的亮度。然后给出一个矩形,要求用这个矩形包住的星星的亮度最大。注意:如果星星在矩形边界上,则不计算这个星星的亮度。

【ps:本题的description是一封极美的情书,文采非常棒,强推!】

思路:

我们来思考一下,一个矩形的位置是不是由这个矩形右上角这个点所决定的,所以我们可以把考虑矩形的位置改为考虑右上角这个点所在的位置。

  然后我们可以发现,对于一颗星星,(x,y),只要右上角这个点在(x+0.1,y+0.1)~(x+w-0.1,y+h-0.1)这个范围内,即可包住这颗星星。此处取0.1的原因是星星不能在矩形边界上。

因此一个星星就可以确定一个矩形,那么本题就变成了给出一大堆矩形,每个矩形都有一个权值,问其中哪一个区域矩形值之和最大。

因此我们可以将每个矩形的左右边界抽离出来,然后就变成了区间覆盖问题。

询问在线段树维护下的这根扫描线上亮度最大的值是多少,所以线段树上只需要维护一个最大值,再加上一个lazy标记,然后边插入边,边更新ans,就可以通过此题。

总结:

扫描线的问题都大同小异,核心在于求出由线段树维护的这一根线上被覆盖的最长长度,或者某一个亮度最大的点的值,维护一下sum或者维护一下max就可以解决问题。

关键点还是在于如何扫的问题上,弄清楚如何扫,接下来的就只是码代码了。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int N = 100000;struct Line{double x,y1,y2;int flag;
}line[N];bool cmp(Line a,Line b)
{return a.x < b.x;
}int n,w,h,num,ans;
double y[N];struct Tree{int l,r,lazy;double ml,mr;int maxn;
}t[N*4];void build(int p,int l,int r)
{t[p].l = l, t[p].r = r, t[p].ml = y[l], t[p].mr = y[r], t[p].maxn = 0, t[p].lazy = 0;if(l == r) return;int mid = (l+r)>>1;build(p*2,l,mid);build(p*2+1,mid+1,r);
}void pushup(int p)
{if(t[p].lazy != 0){t[p*2].lazy += t[p].lazy;t[p*2+1].lazy += t[p].lazy;t[p*2].maxn += t[p].lazy;t[p*2+1].maxn += t[p].lazy;t[p].lazy = 0;}
}void change(int p, Line a)
{
//  cout << a.y1 << " " << a.y2 << endl;if(a.y1 <= t[p].ml && t[p].mr <= a.y2){// t[p].s += a.flag;t[p].lazy += a.flag;t[p].maxn += a.flag;return;}pushup(p);if(t[p*2].mr >= a.y2) change(p*2,a);else if(t[p*2+1].ml <= a.y1) change(p*2+1,a);else{change(p*2,a);change(p*2+1,a);}t[p].maxn = max(t[p*2].maxn,t[p*2+1].maxn);
}   int main()
{while(~scanf("%d%d%d",&n,&w,&h)){ans = 0, num = 0;rep(i,1,n){double x1,y1,z1;scanf("%lf%lf%lf",&x1,&y1,&z1);line[++num].x = x1+0.1, line[num].y1 = y1+0.1, line[num].y2 = y1+h-0.1, y[num] = y1+0.1, line[num].flag = z1;line[++num].x = x1+w-0.1, line[num].y1 = y1+0.1, line[num].y2 = y1+h-0.1, y[num] = y1+h-0.1, line[num].flag = -z1;    }sort(line+1,line+1+num,cmp);sort(y+1,y+1+num);int scr = unique(y+1,y+1+num)-y-1;build(1,1,scr);rep(i,1,num){change(1,line[i]);ans = max(ans,t[1].maxn);}printf("%d\n",ans);}return 0;
}

【POJ 2482】【扫描线问题】Stars in Your Window【包星星问题】相关推荐

  1. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  2. POJ 2482 Stars in Your Window(线段树)

    POJ 2482 Stars in Your Window 题目链接 题意:给定一些星星,每一个星星都有一个亮度.如今要用w * h的矩形去框星星,问最大能框的亮度是多少 思路:转化为扫描线的问题,每 ...

  3. poj 2482 Stars in Your Window (线段树扫描线)

    题目大意: 求一个窗体覆盖最多的星星的权值. 思路分析: 每个星星看成 左下点为x y 右上点为x+w-1 y+h-1 的矩形. 然后求出最大覆盖的和. #include <cstdio> ...

  4. Stars in Your Window 【POJ - 2482】【线段树扫描线】

    题目链接 最开始的时候做成了贪心,离线求二维前缀和,然后树状数组维护二维偏序,这样的想法是存在BUG的,因为我是将每个点当成左下角.右下角.左上角.右上角来分别计算最大贡献的,但这样的做法却不是最贪心 ...

  5. POJ 2482 Stars in Your Window 线段树+扫描线

    妈个鸡,要不是队友提醒,我能把题面上的那封情书读完,读了一半多了都 然后题意就是,在一个平面直角坐标系上,有一些点,每个点有一个权值,用一个矩形框去框住他们,问怎么才能使框住的所有点的权值和最大,边界 ...

  6. poj 2482 Stars in Your Window(线段树+离散化+线扫描)

    题目:http://poj.org/problem?id=2482 大意:在一个坐标系中给你n(10^4)个点(点的坐标范围为0<=x,y<2^31),每个点有一个权值,然后给你一个长宽分 ...

  7. 线段树专辑 —— pku 2482 Stars in Your Window

    http://poj.org/problem?id=2482 A了这题后,我就在想,是不是ACMER都找不到女朋友..... 这题看似很新颖,其实就是求线段树区间最值.所谓区间最值,其实就是和RMQ差 ...

  8. POJ 1151 扫描线 线段树

    题意:给定平面直角坐标系中的N个矩形,求它们的面积并. 题解:建立一个四元组(x,y1,y2,k).(假设y1<y2)用来储存每一条线,将每一条线按x坐标排序.记录所有的y坐标以后排序离散化.离 ...

  9. 《算法竞赛进阶指南》刷题记录

    总算闲下来一些辣!然后最近发现其实看书是真真很有效但是一直没有落实!所以决定落实一下这段时间把这本书看完题目做完! 然后发现还有挺多题目挺巧妙的于是一堆博客预警,,,可能最近会写很多比较水(但是我还是 ...

  10. 【杂】poj2482 Stars in Your Windows 题面的翻译

    原地址:http://poj.org/problem?id=2482 神题,被誉为最浪漫的题目,一位acmer以自己独特的方式写下的殷殷情语,感觉写的太好了,于是翻译了一下,翻译完感觉整个英语水平都提 ...

最新文章

  1. javascript语言学习
  2. 表中字段变化sql语句如何出现
  3. websocket + node.js聊天系统
  4. Django中的视图(view)
  5. (20)FPGA面试技能提升篇(SGMII、LOCALBUS)
  6. 总结Cnblogs支持的常用Markdown语法
  7. STM32F103/429串口IAP+Ymodem升级
  8. 古代汉语复习资料与练习题(适合王力版教材)
  9. C#开发组态软件心路历程
  10. vue3 权限菜单( 树形菜单)无限循环
  11. cpu功耗排行_intel酷睿10代CPU处理器功耗表
  12. 【磨刀不误砍柴工】(SCH-1217) Could not open “XXschematic“ for edit. Would you like to open it for read?问题。
  13. Xshell远程连接服务器上的jupyter notebook
  14. 晶圆检测显微镜是做什么研究才用到的?
  15. 标视界:值得您信赖的商标查询网
  16. 全体起立!广州大学数据库综合设计实验
  17. 干支纪年法简便算法_传感智库丨流速面积法测量明渠断面流量
  18. Git - SSL_ERROR_SYSCALL 问题解决
  19. [Splay的应用]
  20. 计算机职业生涯规划范文网,计算机职业生涯规划书范文

热门文章

  1. 使用CSS来美化你的javafx滚动条
  2. 嵌入式开发之simulation--- 双目移动dsp机器人
  3. python-socket模块基本用法收集
  4. 禁用安全模式小方法!!~
  5. 怎么加密高程点_珠峰咋有4个高度?专业测绘科技工作者解读珠峰高程测算过程...
  6. php有意思的小程序,这应该是迄今为止最全的小程序Top 100 榜单了,php中文网诚意奉上...
  7. java dns 缓存_一次排查多线程引发Java DNS缓存的Bug
  8. python cprofile_Python Profilers 分析器
  9. 【HDU4456】Crowd(曼哈顿距离转切比雪夫距离+二维坐标hash离散化+二维树状数组)
  10. 502php,php502是什么问题