poj 2482(扫描线+离散化)
来源:互联网 发布:淘宝买复合弓违法吗 编辑:程序博客网 时间:2024/05/21 10:28
题意:有n颗星星在天空(相当于平面)上,每个星星都有自己的坐标(x,y)和亮度c,给出一个宽为w高为h的矩形可以把星星包围起来,问能包围的所有星星的亮度和最大是多少,在边界的星星的亮度不计。
题解:对于每个星星都可以确定两条扫描线,左端点是x右端点是x+w高为y边界的权值为c的一条扫描线和左右端点相同高为y+h权值为-c的扫描线,然后用线段树维护区间内亮度的最大值,不计边界上的星星可以用排序,如果两条扫描线高度相同先处理上边界再处理下边界,两个边界就只能取一个边界上的点,相当于不计边界点。坐标范围很大,要离散化。
#include <cstdio>#include <cstring>#include <algorithm>#include <map>#include <vector>using namespace std;const int N = 20005;struct Line { long long lx, rx, h, flag; Line(long long a, long long b, long long c, long long d): lx(a), rx(b), h(c), flag(d) {} bool operator < (const Line& a) const { return h < a.h || (h == a.h && flag < a.flag); }};int n, w, h;long long tree[N << 2], flag[N << 2];vector<long long> a;vector<Line> line;map<long long, int> mp;void pushup(int k) { tree[k] = max(tree[k * 2], tree[k * 2 + 1]);}void pushdown(int k) { if (flag[k]) { flag[k * 2] += flag[k]; flag[k * 2 + 1] += flag[k]; tree[k * 2] += flag[k]; tree[k * 2 + 1] += flag[k]; flag[k] = 0; }}void modify(int k, int left, int right, int l, int r, long long v) { if (l <= left && right <= r) { flag[k] += v; tree[k] += v; return; } pushdown(k); int mid = (left + right) / 2; if (l < mid) modify(k * 2, left, mid, l, r, v); if (r > mid) modify(k * 2 + 1, mid, right, l, r, v); pushup(k);}int main() { while (scanf("%d%d%d", &n, &w, &h) == 3) { a.clear(), line.clear(), mp.clear(); memset(flag, 0, sizeof(flag)); memset(tree, 0, sizeof(tree)); long long x, y, c; for (int i = 0; i < n; i++) { scanf("%lld%lld%lld", &x, &y, &c); line.push_back(Line(x, x + w, y, c)); line.push_back(Line(x, x + w, y + h, -c)); a.push_back(x); a.push_back(x + w); } sort(line.begin(), line.end()); sort(a.begin(), a.end()); a.erase(unique(a.begin(), a.end()), a.end()); int sz = a.size(), sz2 = line.size(); for (int i = 0; i < sz; i++) mp[a[i]] = i; long long res = 0; for (int i = 0; i < sz2; i++) { modify(1, 0, sz - 1, mp[line[i].lx], mp[line[i].rx], line[i].flag); res = max(res, tree[1]); } printf("%lld\n", res); } return 0;}
0 0
- poj 2482(扫描线+离散化)
- poj 1177 Picture 线段树+离散化+线扫描
- POJ 1151 Atlantis 离散化 + 扫描线 + 线段树
- POJ 1151 扫描线+线段树+离散化
- POJ 1151 Atlantis(离散化+扫描线)
- POJ 1177 Picture (线段树+离散化+扫描线) 详解
- picture 1177 poj 线段树+扫描线+离散化
- POJ 1151 Atlantis 扫描线+离散化+线段树
- poj 1151 线段树 离散化 扫描线
- poj 1177 / hdu 1828 线段树 离散化 扫描线
- POJ 3277 City Horizon 扫描线+离散化+线段树
- POJ 1151 Atlantis(线段树+离散化+扫描线)
- poj-1151 Atlantis(线段树+离散化+扫描线)
- poj 1151 Atlantis (线段树+扫描线+离散化)
- 【POJ】1151 Atlantis(线段树+扫描线+离散化)
- POJ 1177 Picture [离散化+扫描线+线段树]
- poj 1511 线段树+离散化+扫描线
- poj 3109 离散化+扫描线+树状数组
- 设计模式之创建者模式
- Android中的数据存储: SharedPreferences,内部存储,外部存储,数据库
- R语言包_plotly
- cocos:command not found 解决方法
- POJ 2836 Rectangular Covering
- poj 2482(扫描线+离散化)
- sql server 2005 链接服务器:未将服务器 配置为用于 RPC
- 新人乍到
- 14个不可错过的面试成功技巧(送给正在找工作的你)
- 971 爬行的蚂蚁【水题...】
- POJ 1068 Parencodings
- 关于Web Sevice
- FFT中的栅栏效应
- 格雷码实现