poj 2482 Stars in Your Window(扫描线)
2015-08-07 14:20
393 查看
题目链接:poj 2482 Stars in Your Window
题目大意:平面上有N个星星。问一个W∗H的矩形最多能括进多少个星星。
解题思路:扫描线的变形。仅仅要以每一个点为左上角。建立矩形,这个矩形即为框框左下角放的位置能够括到该点,那么N个星星就有N个矩形,扫描线处理哪些位置覆盖次数最多。
题目大意:平面上有N个星星。问一个W∗H的矩形最多能括进多少个星星。
解题思路:扫描线的变形。仅仅要以每一个点为左上角。建立矩形,这个矩形即为框框左下角放的位置能够括到该点,那么N个星星就有N个矩形,扫描线处理哪些位置覆盖次数最多。
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 40000; #define lson(x) ((x)<<1) #define rson(x) (((x)<<1)|1) int lc[maxn << 2], rc[maxn << 2]; ll v[maxn << 2], s[maxn << 2]; inline void pushup (int u) { s[u] = max(s[lson(u)], s[rson(u)]) + v[u]; } inline void maintain (int u, int d) { v[u] += d; pushup(u); } void build (int u, int l, int r) { lc[u] = l; rc[u] = r; v[u] = s[u] = 0; if (l == r) return; int mid = (l + r) / 2; build(lson(u), l, mid); build(rson(u), mid + 1, r); pushup(u); } void modify (int u, int l, int r, int d) { if (l <= lc[u] && rc[u] <= r) { maintain(u, d); return; } int mid = (lc[u] + rc[u]) / 2; if (l <= mid) modify(lson(u), l, r, d); if (r > mid) modify(rson(u), l, r, d); pushup(u); } struct Seg { ll x, l, r, d; Seg (ll x = 0, ll l = 0, ll r = 0, ll d = 0) { this->x = x; this->l = l; this->r = r; this->d = d; } friend bool operator < (const Seg& a, const Seg& b) { return a.x < b.x; } }; int N, W, H; vector<ll> pos; vector<Seg> vec; inline int find (ll k) { return lower_bound(pos.begin(), pos.end(), k) - pos.begin(); } void init () { ll x, y, d; pos.clear(); vec.clear(); for (int i = 0; i < N; i++) { scanf("%lld%lld%lld", &x, &y, &d); pos.push_back(y - H); pos.push_back(y); vec.push_back(Seg(x - W, y - H, y, d)); vec.push_back(Seg(x, y - H, y, -d)); } sort(pos.begin(), pos.end()); sort(vec.begin(), vec.end()); } ll solve () { ll ret = 0; build (1, 0, pos.size()); for (int i = 0; i < vec.size(); i++) { modify(1, find(vec[i].l), find(vec[i].r) - 1, vec[i].d); ret = max(ret, s[1]); } return ret; } int main () { while (scanf("%d%d%d", &N, &W, &H) == 3) { init(); printf("%lld\n", solve()); } return 0; }
相关文章推荐
- eclipse配置hadoop插件
- python trackback的使用心得
- hdu 3584 Cube (三维树状数组,更新区间,查询单点)
- 一次「Too many open files」故障
- Symmetric Tree
- Java动态代理实现(简单AOP实现)
- Codeforces 567 E. President and Roads
- codeforces 567D One-Dimensional Battle Ships (set)
- 新的Android databinding与android-apt plugin冲突
- 谷歌镜像
- Python学习笔记
- shutdown
- GitHub上史上最全的Android开源项目分类汇总
- Oracle创建表空间,用户,分配权限
- Hdu 2015 Multi-University Training Contest6
- eclipse从数据库逆向生成Hibernate实体类
- FileToData与DataToFile(优化版,txt为原始文件2倍大小)
- 如何运行代码apk安装
- 看懂java的class文件(字节码)(好)
- Java开发中的23种设计模式详解