51nod 1208 窗上的星星 | 线段树 扫描线
51nod 1208 Stars In Your Window
题面
整点上有N颗星星,每颗星星有一个亮度。用一个平行于x轴和y轴,宽为W高为H的方框去套星星。套住的所有星星的亮度之和为S(包括边框上的星星),求S的最大值。
Input
第1行:共3个数N, W, H,中间用空格分割,N为星星的数量,W为方框的宽度,H为方框的高度。(2 <= N <= 50000, 1 <= W, H <= 10^9)
第2 - N + 1行:每行3个数,X, Y, L,中间用空格分隔,分别表示星星的横坐标X,纵坐标Y,以及星星的亮度L。(1 <= X, Y <= 10^9,1 <= L <= 10000)
Output
输出方框能够套住的最大亮度和S。
Input示例
6 3 3
1 1 2
2 2 3
3 3 4
4 4 3
5 5 2
6 6 1
Output示例
12
用一个矩形表示一颗星星,矩形宽W高H,左下角卡在原来星星的位置。当一个点被“星星矩形”覆盖时,这个点的权值就加上星星的亮度。这样,权值最大的位置就是矩形方块最佳放置位置的右上角。
仍然是离散化后用扫描线做。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
typedef long long ll;
#define space putchar(' ')
#define enter putchar('\n')
#define INF 0x3f3f3f3f
template <class T>
bool read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
else if(c == EOF) return 0;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
return 0;
}
template <class T>
void write(T x){
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 1000005;
int n, ans, W, H, lstX[N], tmp[N], cntX;
struct Query {
int h, l, r, x;
bool operator < (const Query &b) const{
return h < b.h;
}
} q[N];
void init(){
read(n), read(W), read(H);
for(int i = 1, x, y, z; i <= n; i++){
read(x), read(y), read(z);
q[2*i-1].l = q[2*i].l = lstX[2*i-1] = x;
q[2*i-1].r = q[2*i].r = lstX[2*i] = x + W;
q[2*i-1].h = y;
q[2*i].h = y + H + 1;
q[2*i-1].x = z;
q[2*i].x = -z;
}
sort(lstX + 1, lstX + 2 * n + 1);
for(int i = 1; i <= 2 * n; i++) tmp[i] = lstX[i];
for(int i = 1; i <= 2 * n; i++)
if(i == 1 || tmp[i] != tmp[i - 1])
lstX[++cntX] = tmp[i];
}
int getX(int x){
return lower_bound(lstX + 1, lstX + cntX + 1, x) - lstX;
}
int data[4*N], lazy[4*N];
void pushdown(int k){
data[k << 1] += lazy[k], data[k << 1 | 1] += lazy[k];
lazy[k << 1] += lazy[k], lazy[k << 1 | 1] += lazy[k];
lazy[k] = 0;
}
void change(int k, int l, int r, int ql, int qr, int x){
if(ql <= l && qr >= r) return (void) (data[k] += x, lazy[k] += x);
pushdown(k);
int mid = (l + r) >> 1;
if(ql <= mid) change(k << 1, l, mid, ql, qr, x);
if(qr > mid) change(k << 1 | 1, mid + 1, r, ql, qr, x);
data[k] = max(data[k << 1], data[k << 1 | 1]);
}
int main(){
init();
sort(q + 1, q + 2 * n + 1);
for(int i = 1; i <= 2 * n; i++){
if(i == 1 || q[i].h != q[i - 1].h)
ans = max(ans, data[1]);
change(1, 1, cntX, getX(q[i].l), getX(q[i].r), q[i].x);
}
write(ans), enter;
return 0;
}
51nod 1208 窗上的星星 | 线段树 扫描线的更多相关文章
- 51nod 1494 选举拉票 (线段树+扫描线)
1494 选举拉票 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 现在你要竞选一个县的县长.你去对每一个选民进 ...
- 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线
51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...
- 【学习笔记】线段树—扫描线补充 (IC_QQQ)
[学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
随机推荐
- 执行caffe的draw_net.py出现“GraphViz's executable "dot" not found”的解决方法
控制台输入如下指令画网络图: python ../../../python/draw_net.py train.prototxt train.png --rankdir=TB (Top-Bottom形 ...
- 增强学习训练AI玩游戏
1.游戏简介 符号A为 AI Agent. 符号@为金币,AI Agent需要尽可能的接取. 符号* 为炸弹,AI Agent需要尽可能的躲避. 游戏下方一组数字含义如下: Bomb hit: 代表目 ...
- tomcat启动项目的时候不报错而且启动的很快
最后发现是tomcat部署项目的时候,并没有将一部分文件复制到tomcat的目录下 方法 将没有添加的目录 Finish
- docker node项目 连接mongodb
在弄docker部署node项目的时候遇到了连接mongdb的问题,记录一下问题解决办法 一.Docker 安装 MongoDB 1.查找Docker Hub上的mongo镜像 [root@VM_49 ...
- CocoStuff—基于Deeplab训练数据的标定工具【五、训练成果分析】
一.说明 本文为系列博客第五篇,主要展示训练的结果,以及对训练进行分析. *注:暂未进行大量的数据训练以及IoU测算,目前只做到使用Matlab将训练结果的mat文件可视化. 二. *占坑
- 机器学习算法 --- Pruning (decision trees) & Random Forest Algorithm
一.Table for Content 在之前的文章中我们介绍了Decision Trees Agorithms,然而这个学习算法有一个很大的弊端,就是很容易出现Overfitting,为了解决此问题 ...
- js备忘录6
- Servlet各版本web.xml的头文件配置模板
原文: http://www.codeweblog.com/servlet%E5%90%84%E7%89%88%E6%9C%ACweb-xml%E7%9A%84%E5%A4%B4%E6%96%87%E ...
- Notes of Daily Scrum Meeting(11.4)
Notes of Daily Scrum Meeting 2014年11月4日 星期二 20:30—21:00 团队成员 今日团队任务 当日工作分配额 完成情况 陈少杰 阅读理解代码中底层与数据库 ...
- beat冲刺(6/7)
目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(6/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 ppt制作 视频拍摄 接下来的计划 准备答辩 ...