题目链接


最开始的时候做成了贪心,离线求二维前缀和,然后树状数组维护二维偏序,这样的想法是存在BUG的,因为我是将每个点当成左下角、右下角、左上角、右上角来分别计算最大贡献的,但这样的做法却不是最贪心的,因为有可能该点并不作为矩形的四个顶角,而是作为内部点时候就是一个不够贪婪的贪心。

譬如说是这种情况就不符合贪心策略

好了,找到了问题所在就方便多了,而不是去持续的debug了。

让我们换种思维来想,每个点向右影响的范围是有限的,也就是这个点到[pos, pos + W - 1]这段区间,这是水平时候,当然垂直时候也是一样的,因为点不能在边界上。

所以,我们不妨可以假设为这段区间都收到它的影响,并且把每个点的影响都向右走,然后岂不是变成了一个区间最大值的问题了嘛!

我们一Y轴坐标升序,然后用vector存点序号,然后如此更新来求最大值即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
#define MAX_3(a, b, c) max(a, max(b, c))
#define Rabc(x) x > 0 ? x : -x
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e4 + 7;
int N, _UX, _UY;
ll W, H, Lsan_X[maxN], Lsan_Y[maxN];
vector<int> vt[maxN];
struct node
{ll x, y; int c;node(ll a=0, ll b=0, int _c=0):x(a), y(b), c(_c) {}inline void In() { scanf("%lld%lld%d", &x, &y, &c); }
} a[maxN];
inline bool cmp(int e1, int e2) { return a[e1].x < a[e2].x; }
int tree[maxN << 2], lazy[maxN << 2];
inline void pushdown(int rt)
{if(lazy[rt]){tree[lsn] += lazy[rt]; tree[rsn] += lazy[rt];lazy[lsn] += lazy[rt]; lazy[rsn] += lazy[rt];lazy[rt] = 0;}
}
void update(int rt, int l, int r, int ql, int qr, int val)
{if(ql <= l && qr >= r){tree[rt] += val;lazy[rt] += val;return;}pushdown(rt);int mid = HalF;if(qr <= mid) update(QL, val);else if(ql > mid) update(QR, val);else { update(QL, val); update(QR, val); }tree[rt] = max(tree[lsn], tree[rsn]);
}
inline void solve()
{int id = 1, ans = 0;for(int i=1, len, L, R; i<=_UY; i++){while(id < i && Lsan_Y[i] - Lsan_Y[id] >= H){len = (int)vt[id].size();for(int j=0; j<len; j++){L = (int)a[vt[id][j]].x;R = (int)(upper_bound(Lsan_X + 1, Lsan_X + _UX + 1, Lsan_X[L] + W - 1) - Lsan_X - 1);if(L <= R) update(1, 1, _UX, L, R, -a[vt[id][j]].c);}id++;}len = (int)vt[i].size();for(int j=0; j<len; j++){L = (int)a[vt[i][j]].x;R = (int)(upper_bound(Lsan_X + 1, Lsan_X + _UX + 1, Lsan_X[L] + W - 1) - Lsan_X - 1);if(L <= R) update(1, 1, _UX, L, R, a[vt[i][j]].c);ans = max(ans, tree[1]);}}if(!W || !H) ans = 0;printf("%d\n", ans);
}
inline void init()
{for(int i=1; i<=N; i++) vt[i].clear();for(int i=1; i<=(N << 2); i++) tree[i] = lazy[i] = 0;
}
int main()
{while(scanf("%d%lld%lld", &N, &W, &H) != EOF){init();for(int i=1; i<=N; i++){a[i].In();Lsan_X[i] = a[i].x; Lsan_Y[i] = a[i].y;}sort(Lsan_X + 1, Lsan_X + N + 1);sort(Lsan_Y + 1, Lsan_Y + N + 1);_UX = (int)(unique(Lsan_X + 1, Lsan_X + N + 1) - Lsan_X - 1);_UY = (int)(unique(Lsan_Y + 1, Lsan_Y + N + 1) - Lsan_Y - 1);for(int i=1; i<=N; i++){a[i].x = (int)(lower_bound(Lsan_X + 1, Lsan_X + _UX + 1, a[i].x) - Lsan_X);a[i].y = (int)(lower_bound(Lsan_Y + 1, Lsan_Y + _UY + 1, a[i].y) - Lsan_Y);vt[a[i].y].push_back(i);}for(int i=1; i<=_UY; i++) sort(vt[i].begin(), vt[i].end(), cmp);solve();}return 0;
}

讲真,想一开始的贪心方法的不够贪婪之处,真的想了好久,一直以为没错(大雾

Stars in Your Window 【POJ - 2482】【线段树扫描线】相关推荐

  1. POJ 1151 线段树+扫描线

    题意:求矩形面积的并 思路: 注意是[l,mid][mid,r] 这是真正的线段了 就当扫描线模板使吧~ //By SiriusRen #include <cmath> #include ...

  2. 线段树扫描线求矩形周长详解

    线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...

  3. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  4. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  5. hdu 1542 Atlantis (线段树+扫描线)

    http://acm.hdu.edu.cn/showproblem.php?pid=1542 单纯的线段树+扫描线求面积并,需要离散化. code: #include <cstdlib> ...

  6. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  7. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线(线段树扫描线)

    1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 732  Solved: ...

  8. 亚特兰蒂斯【线段树+扫描线+离散化】

    亚特兰蒂斯[线段树+扫描线+离散化] POJ1151.ACwing247 题目: 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述. 其中一些甚至包括岛屿部分地图. 但不幸的是,这些地图描述了亚特 ...

  9. 2016 UESTC Training for Data Structures F - 郭大侠与“有何贵干?” CDOJ 1335 线段树 扫描线 离散化

    F - 郭大侠与"有何贵干?" 就是给一个三维空间,和N个长方体,问覆盖K次的体积 x和y都是1e9,但是z是[1,3],所以可以把这个分为两个二维平面,求被覆盖K次的面积,最后加 ...

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

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

最新文章

  1. Python Web实战:Python+Django+MySQL实现基于Web版的增删改查
  2. centos 一键安装ftp 配置_CentOS快速搭建FTP(初级-四步)
  3. javascript中setInterval,setTimeout的区别跟用法
  4. 如何为项目中的单个文件禁用ARC?
  5. three相机在模型上_一步步带你实现web全景看房——three.js
  6. linux下 Wowza安装与ffmpeg测试
  7. 读取图像教程,生成h5py文件的教程
  8. 分享2个堪称黑科技的Ai一键抠图网站 让你秒变PS抠图大神
  9. 自律的力量 No Excuse: the power of self-discipline
  10. Hyper-V 的用途与安装
  11. 使用Helm在k8s集群上部署以太坊私有链
  12. 5 个 GitHub 项目拿下 Linux
  13. jr某头条新闻爬虫(超详细)
  14. Brat 标注工具 配置文件 详细说明
  15. 07年五大BT网站排行榜 - 电影、音乐还有传票
  16. VS调试出现错误提示 无法将“obj\Debug\*.*”复制到“bin\Debug\*.*”,文件正在由另一个进程使用,因此该进程无法访问此文件
  17. uboot代码解析1:根据目的找主线
  18. 史上最全电磁仿真(HFSS、CST、FEKO)时域、频域精准配置推荐
  19. pwngdb+pwngef+peda三合一+pwngdb+pwndbg联合使用
  20. java 创建水果_java程序题:定义一个抽象类-水果,其中包括getWeight()方法,编写程序分别创建苹果、...

热门文章

  1. WZOI-216猴子吃桃
  2. 第四集 孤胆翻越橡皮山,丈量生命之厚度
  3. Linux 配置git同步GitHub代码
  4. 晨之替——谷川 俊太郎
  5. UE5 Oculus Quest 2 VR中设置手柄摇杆移动蓝图
  6. Win7系统如何卸载残留无用驱动设备
  7. MT7621芯片性能,MT7621路由器参数介绍
  8. 将正确的ADC与应用程序匹配
  9. OK6410A移植mw150us无线网卡驱动
  10. Vue获取浏览器唯一标识