设为首页 加入收藏

TOP

POJ 2482――Stars in Your Window(线段树+扫描线,二维区域最值转化为线段树-经典)最浪漫的题目(二)
2015-07-20 17:34:25 来源: 作者: 【 】 浏览:3
Tags:POJ 2482 Stars Your Window 线段 扫描 二维 区域 化为 经典 浪漫 题目
Zb3VyIHRhc2sgaXMgdG8gdGVsbCB3aGVyZSBJIHNob3VsZCBwdXQgdGhlIHdpbmRvdyBpbiBvcmRlciB0byBtYXhpbWl6ZSB0aGUgc3VtIG9mIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBzdGFycyB3aXRoaW4gdGhlIHdpbmRvdy4gTm90ZSwgdGhlIHN0YXJzIHdoaWNoIGFyZSByaWdodCBvbiB0aGUgZWRnZSBvZiB0aGUgd2luZG93IGRvZXMgbm90IGNvdW50LiBUaGUKIHdpbmRvdyBjYW4gYmUgdHJhbnNsYXRlZCBidXQgcm90YXRpb24gaXMgbm90IGFsbG93ZWQuIDxicj4KCjxwIGNsYXNzPQ=="pst">Input

There are several test cases in the input. The first line of each case contains 3 integers: n, W, H, indicating the number of stars, the horizontal length and the vertical height of the rectangle-shaped window. Then n lines follow, with 3 integers each: x, y, c, telling the location (x, y) and the brightness of each star. No two stars are on the same point.

There are at least 1 and at most 10000 stars in the sky. 1<=W,H<=1000000, 0<=x,y<2^31.

Output

For each test case, output the maximum brightness in a single line.

Sample Input

3 5 4
1 2 3
2 3 2
6 3 1
3 5 4
1 2 3
2 3 2
5 3 1

Sample Output

5
6

――――――――――――――――――――――――分割线――――――――――――――――――――――


题目大意:

浪漫的情书。遇见这样的就嫁了吧

给你n颗星星的坐标,给你一个矩形区域,求在这个矩形区域内最大的星星亮度和


思路:

看了结题报告才会的自己完全没思路

看了n篇结题报告

下面搞 二维树状数组解法 和 扫面线+离散解法


//--------------------------------------------------------------------------------------------------------------------------//


要解决这个问题,首先要知道一个东西,就是给出一个一维的数列,怎么找出连续的,小于等于w个的数,它们的和最大。这个问题可以用线段树O(nlogn)地解决,在将一个数a放到x这个位置的同时,放一个相反数-a在x+w的位置,然后求出整个区间的最大和就是答案。注意,应该先插入-a,再插入a。




首先注意到最优解肯定是窗子的右上角(或其他角)在某个星星位置处(这里的在是模糊的在,略微比星星的位置大一点,能包含这个星星就行)。这样就将问题变成离散空间上的问题了。然后问题关键就是将二维问题变成一维问题,先只考虑x轴方向的一维,可以想到一个星星的起到的作用是一条长度为w的线段,然后答案就是找到被最多线段覆盖的某点,就是区间最值问题了。那么再考虑y轴这一维,这一维可以认为是线段的存活时间。那么将星星分成两条线段,一个代表出生,一个代表死亡,然后按照y坐标顺序插入星星(因为在每个y坐标出要么产生一个新的线段,要么减少一个线段,都会改变已有线段树的状态),线段树的作用就是维护一个区间最值。

我觉得类似的问题有林涛论文《线段树的应用》中的例题 “蛇”,也是有类似这种二维变一维,存活时间的思想。

// ------------------------ ――转载



对每个星星构建一个矩形,长度为w,宽度为h,下底边权值为c,上底边权值为-c

离散化横坐标,对高度h从小到大排序

维护最大前缀和

同一条线段前缀和相加,不同线段取最大

区间维护


#include
  
   
#include
   
     #include
    
      #include
     
       #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn=22222; using namespace std; ll cnt[maxn<<2],sum[maxn<<2]; ll X[maxn<<1]; struct Seg { ll l,r,h; int s; Seg(){}; Seg(ll a,ll b,ll c,ll d):l(a),r(b),h(c),s(d){}; bool operator<(const Seg&cmp)const{ if(h==cmp.h) return s
      
       >1; if(L<=m) update(L,R,c,lson); if(m
       
        


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇leetcode - Triangle 下一篇nyist oj 117 求逆序数 (归并排序..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)