扫描线 矩形内围起的星星亮度总和最大大 poj2482 Stars in Your Window
来源:互联网 发布:五金进入货软件 编辑:程序博客网 时间:2024/05/17 23:13
题目链接 poj2482 Stars in Your Window
题目大意:给你一些星星的坐标以及这些星星的亮度(x y c),然后给你一个矩形的框框,长宽分别为W、H,让你用这个框框去围住一个矩形的区域,要求区域内的星星亮度总和最大,并且矩形边框的星星不计入气内。
解题思路: 对于每颗星星我们都对它进行一次构造,构造一个(W-1)*(H-1)的矩形(为什么不用W*H,因为边框的星星不算入内啦),让星星对应相应的构造矩形区域的最左下角,题目不就可以转化成求某点最大的覆盖亮度了么。每次更新前,记录总区间内某点覆盖亮度的最大值,最后取得最大值。
题目上半部分:很优美的情书。题目下半部分:很经典的扫描线构造题。赞一个。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;#define lz 2*u,l,mid#define rz 2*u+1,mid+1,rconst int maxn=50005;__int64 max_sum[4*maxn];__int64 flag[4*maxn];__int64 X[maxn];struct Node{ __int64 lx, rx, h, s; Node() {} Node(__int64 lx_, __int64 rx_, __int64 h_, __int64 s_) { lx=lx_, rx=rx_, h=h_, s=s_; } bool operator<(const Node &S)const { if(h==S.h) return s>S.s; ///!!!注意这里,错了无数次 return h<S.h; }} line[2*maxn];void push_down(int u, int l, int r){ if(flag[u]!=0) { flag[2*u]+=flag[u]; flag[2*u+1]+=flag[u]; max_sum[2*u]+=flag[u]; max_sum[2*u+1]+=flag[u]; flag[u]=0; }}void Update(int u, int l, int r, int tl, int tr, int c){ if(tl>tr) return ; ///!!!注意 当x1==x2时,会导致RE,因为算区间的时候x2会减-1 if(tl<=l&&r<=tr) { flag[u]+=c; max_sum[u]+=c; return ; } push_down(u,l,r); int mid=(l+r)>>1; if(tr<=mid) Update(lz,tl,tr,c); else if(tl>mid) Update(rz,tl,tr,c); else { Update(lz,tl,mid,c); Update(rz,mid+1,tr,c); } max_sum[u]=max(max_sum[2*u],max_sum[2*u+1]);}int find(__int64 tmp, int n){ int l=1, r=n, mid; while(l<=r) { mid=(l+r)>>1; if(X[mid]==tmp) return mid; else if(X[mid]<tmp) l=mid+1; else r=mid-1; }}int main(){ int n, w, h; while(cin >> n >> w >> h) { memset(flag,0,sizeof(flag)); memset(max_sum,0,sizeof(max_sum)); int num=0, ep=1; __int64 x,y,c; for(int i=0; i<n; i++) { scanf("%I64d%I64d%I64d",&x,&y,&c); line[++num]=Node(x,x+w-1,y,c); X[num]=x; line[++num]=Node(x,x+w-1,y+h-1,-c); X[num]=x+w-1; } sort(X+1,X+num+1); sort(line+1,line+num+1); for(int i=2; i<=num; i++) if(X[i]!=X[ep]) X[++ep]=X[i]; __int64 ans=0, lbd=1, rbd=ep; for(int i=1; i<num; i++) { int l=find(line[i].lx,ep); int r=find(line[i].rx,ep); Update(1,lbd,rbd,l,r,line[i].s); ans=max(ans,max_sum[1]); } cout << ans <<endl; } return 0;}
0 0
- 扫描线 矩形内围起的星星亮度总和最大大 poj2482 Stars in Your Window
- poj2482--Stars in Your Window(扫描线)
- 【poj2482】Stars in Your Window (扫描线+线段树)
- Poj 2482 Stars in Your Window(用W*H的矩形去围住一个区域,使得这个区域内的星星的亮度最大)
- POJ2482--Stars in Your Window
- poj2482 Stars in Your Window
- POJ2482-Stars in Your Window
- poj2482 Stars in Your Window hdu 5091 Beam Cannon 线段树 扫描线
- poj2482 Stars in Your Window(成段更新+扫描线)
- [POJ2482]Stars in Your Window(离散化+扫描线+线段树)
- poj2482 Stars in Your Window(线段树+扫描线+离散化)
- 线段树 poj2482 Stars in Your Window
- POJ2482 Stars in Your Window(线段树)
- 线段树经典题目:POJ2482 Stars in Your Window
- POJ_2482 Stars in Your Window 扫描线 + 线段树
- POJ 2482 Stars in Your Window(扫描线)
- 扫描线 POJ 2482 Stars in Your Window
- poj 2482 Stars in Your Window(线段树+扫描线)
- 扫描线 求挖空矩形合并面积 hdu3265 Posters
- poj 1195 Mobile phones(二维树状数组)
- 1418 - Trees on My Island ( Peake's theorem )
- 构建android UI 学习心得,摘要
- HDU 5119 Happy Matt Friends (01背包)
- 扫描线 矩形内围起的星星亮度总和最大大 poj2482 Stars in Your Window
- Sql存储过程中判断某个数据表的某一行的某列的值是否为NUll
- lintcode-将表达式转换为逆波兰表达式-370
- 第二阶段计划
- 算法研发工作中对于MPI和Spark的一些困惑?
- 轻量化ViewController的几个小技巧
- C++primer学习:智能指针与动态内存(1)
- HP生活
- hdu 5501 The Highest Mark(贪心+背包)