妈个鸡,要不是队友提醒,我能把题面上的那封情书读完,读了一半多了都

然后题意就是,在一个平面直角坐标系上,有一些点,每个点有一个权值,用一个矩形框去框住他们,问怎么才能使框住的所有点的权值和最大,边界上的点不算。

边界上的点 不算,我之前只做到过一次边界上的点算的啊,怎么办,把长和宽都各自-1就好啦。处理之后,设长为w,宽为h。

大概就是,把一个点沿一个方向,假如说是x轴,沿x轴向正方向延长w个长度,然后这是一条入边,在y+h+1上,建一条相应的出边,就是权值取个负数,就相当于把这条边又给删去啦。

然后将所有的边按y排序,根据y从小到大,加入边,就是更新(x,x+w)这个区间。想想,这样的话,某一点 x0就可以有x0为右边界的矩形的框住的权值和,然后y又是从下往上扫的,而且还有出边,所以(x0,y0)表示以这个点为右上角的矩形框住的权值和。

比如我们更新到了y=yi,在把所有y=yi的边都更新之后,线段树存的是x,对应的最大值。所以线段树的根的最大值,就代表在y=yi下(xi,yi)为右上角的矩形框住最大权值和。

然后y从0扫到最大值,就可以得到最大权值和啦。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 10002
#define uint unsigned int
uint x_data[maxn * 2], y_data[maxn * 2];
struct Node
{unsigned int x, y;int val;void made(unsigned int a, unsigned int b,int c){x = a, y = b, val = c;}
}node[maxn];
struct edge_mode
{int y, l, r, val;void edge_make(int y, int l, int r, int val){this->y = y;this->l = l;this->r = r;this->val = val;}
}edge[20005];
struct segment
{int add, max;
}segtree[160005];
bool cmp(edge_mode a, edge_mode b)
{if (a.y < b.y) return true;else return false;
}
void init(int id, int l, int r)
{segtree[id].add = segtree[id].max = 0;if (l == r) return;init(id << 1, l, (l + r) >> 1);init(id << 1 | 1, ((l + r) >> 1) + 1, r);
}
void update(int id, int l, int r, int nl, int nr, int val)
{if (r<nl || l>nr) return;if (l >= nl&&r <= nr){segtree[id].add += val;segtree[id].max += val;return;}update(id << 1, l, (l + r) >> 1, nl, nr, val);update(id << 1 | 1, ((l + r) >> 1) + 1, r, nl, nr, val);segtree[id].max = max(segtree[id << 1].max, segtree[id << 1 | 1].max) + segtree[id].add;
}
int main()
{//freopen("input.txt", "r", stdin);int n, w, h;while ((scanf("%d%d%d", &n, &w, &h)) == 3){--w, --h;init(1, 0, 20000);//unsigned int x, y;for (int i = 0; i < n; ++i){scanf("%u%u%d", &node[i].x, &node[i].y, &node[i].val);x_data[2 * i] = node[i].x, x_data[2 * i + 1] = node[i].x + w;y_data[2 * i] = node[i].y, y_data[2 * i + 1] = node[i].y + h + 1;}sort(x_data, x_data + 2 * n);sort(y_data, y_data + 2 * n);uint x_d = unique(x_data, x_data + 2 * n) - x_data, y_d = unique(y_data, y_data + 2 * n) - y_data;for (int i = 0; i < n; ++i){int x1 = lower_bound(x_data, x_data + x_d, node[i].x) - x_data;int y1 = lower_bound(y_data, y_data + y_d, node[i].y) - y_data;int x2 = lower_bound(x_data, x_data + x_d, node[i].x + w) - x_data;int y2 = lower_bound(y_data, y_data + y_d, node[i].y + h + 1) - y_data;edge[2 * i].edge_make(y1, x1, x2, node[i].val);edge[2 * i + 1].edge_make(y2, x1, x2, -1 * node[i].val);//printf("%d %d %d %d %d\n", x1, y1, x2, y2, node[i].val);}sort(edge, edge + 2 * n, cmp);int ans = 0;for (int i = 0, t = 0; i <= 20000; i++){while (edge[t].y == i&&t < 2 * n){update(1, 0, 20000, edge[t].l, edge[t].r, edge[t].val);t++;}//if (i <= 5)//printf("%d\n", segtree[1].max);ans = max(ans, segtree[1].max);}printf("%d\n", ans);}//while (1);return 0;
}

POJ 2482 Stars in Your Window 线段树+扫描线相关推荐

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

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

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

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

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

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

  4. poj 2528 Mayor's posters(线段树+离散化)

    1 /* 2 poj 2528 Mayor's posters 3 线段树 + 离散化 4 5 离散化的理解: 6 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 使用计算机视觉在钢铁平面上检测焊接缺陷
  2. [CES 2018] 上手测试:刚公布的 TPCast Plus 无线适配器
  3. linux mv命令改名,linux中mv命令使用详解(移动文件或者将文件改名)
  4. 亲手完成四大企业实战项目,挑战Python全栈高薪岗位!
  5. mysql.data.dll win10_【MySQL】Windows10下安装
  6. python组合数据类型实验_实验七 组合数据类型
  7. 0514实训演练 新建项目 使用java编写类与对象 入门
  8. 使用Windows版Redis
  9. Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)
  10. 淘宝HSF 框架使用 总结
  11. 数据结构课程设计【银行储蓄系统】
  12. 360木马公司之流氓本色
  13. 元素JavaScript知识点梳理与经典百例
  14. Latex 页眉页脚在一章的第1页之后不显示及位置混乱的问题解决
  15. Mask R-CNN结构细节回顾
  16. 【操作系统实验】模拟单处理器系统的进程调度
  17. 学计算机好还是学数学好,大学专业学计算机好还是学数学好
  18. 信号傅里叶变换后的实数和虚数部分理解
  19. 085 《穷查理宝典》简记
  20. mysql5.5手册读书日记(2)

热门文章

  1. 将多个单词利用字符串拼接,输出成一句话
  2. 【大一年度总结与展望未来】一个普通双非的大学生
  3. 笔记本损耗60 计算机提示,笔记本买了一年 电池损耗已经60%了 怎么处理啊
  4. win10升级win11后笔记本电脑充不了电解决方法
  5. 高级自动化测试常见面试题(Web、App、接口)
  6. 计算机月考flash试卷,11青鸟《 flash动画》月考试卷
  7. Mark一个关于Thymeleaf 使用th:field属性与对象属性绑定的小问题
  8. OpenWrt设置.端口转发和远程访问路由器
  9. istio-jaeger部署
  10. 怎样把公司名称标注在百度地图上