BZOJ1218(线段树+扫描线)
1.扫描线扫描x轴,线段树维护y轴。
2.坐标+1,线段树是从1开始维护。然后让边长--,这样就能包含边上的点了。
3.为了保证点在正方形内:在x轴上利用差分的思想,在x出Add(val),在x+r(已经-1了)处Add(-val);在y轴上利用线段树维护1~5001这个区间,在y~y+r上Add(val)。
题解博客大家都是口胡感觉难以讲清这个事情,这篇博客虽然没解释但代码逻辑不错,看懂的。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cctype>
#include <climits>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>
#include <sstream>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <list>
#include <fstream>
#include <bitset>
#define init(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define irep(i, a, b) for (int i = a; i >= b; i--)
#define ls(p) p << 1
#define rs(p) p << 1 | 1
using namespace std; typedef double db;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int inf = 0x3f3f3f3f;
const ll INF = 1e18; template <typename T> void read(T &x) {
x = ;
int s = , c = getchar();
for (; !isdigit(c); c = getchar())
if (c == '-') s = -;
for (; isdigit(c); c = getchar())
x = x * + c - ;
x *= s;
} template <typename T> void write(T x) {
if (x < ) x = -x, putchar('-');
if (x > ) write(x / );
putchar(x % + '');
} template <typename T> void writeln(T x) {
write(x);
puts("");
} const int maxn = 1e4 + , M = ;
int n, r, cnt;
struct Seg {
int l, r, mx, tag;
}t[(M + ) << ];
struct node {
int x, y1, y2, val;
}c[maxn << ]; void build(int l, int r, int p) {
t[p].l = l, t[p].r = r;
if (l == r) {
t[p].mx = t[p].tag = ;
return;
}
int mid = (l + r) >> ;
build(l, mid, ls(p));
build(mid + , r, rs(p));
} void push_down(int p) {
if (t[p].tag) {
int tag = t[p].tag;
t[ls(p)].mx += tag;
t[rs(p)].mx += tag;
t[ls(p)].tag += tag;
t[rs(p)].tag += tag;
t[p].tag = ;
}
} void Add(int l, int r, int p, int k) {
if (l <= t[p].l && t[p].r <= r) {
t[p].tag += k;
t[p].mx += k;
return;
}
push_down(p);
int mid = (t[p].l + t[p].r) >> ;
if (l <= mid) Add(l, r, ls(p), k);
if (mid < r) Add(l, r, rs(p), k);
t[p].mx = max(t[ls(p)].mx, t[rs(p)].mx);
} int Query(int l, int r, int p) {
if (l <= t[p].l && t[p].r <= r) {
return t[p].mx;
}
push_down(p);
int ret = ;
int mid = (t[p].l + t[p].r) >> ;
if (l <= mid) ret = max(ret, Query(l, mid, ls(p)));
if (mid < r) ret = max(ret, Query(mid + , r, rs(p)));
return ret;
} bool cmp(node a, node b) {
if (a.x != b.x) return a.x < b.x;
return a.val > b.val;
} int solve() {
int ans = ;
build(, M, );
rep(i, , n) {
int x, y, z;
read(x), read(y), read(z);
c[++cnt] = {x + , y + , y + r, z};
c[++cnt] = {x + r, y + , y + r, -z};
}
sort(c + , c + + cnt, cmp); for (int i = , j, k; i <= cnt; i = j) {
int tmp = c[i].x;
for (j = i; j <= cnt && c[j].x == tmp; j++);
for (k = i; k < j && c[k].val > ; k++) {
Add(c[k].y1, c[k].y2, , c[k].val);
}
ans = max(ans, Query(, M, ));
for (; k < j; k++) {
Add(c[k].y1, c[k].y2, , c[k].val);
}
}
return ans;
} int main() {
read(n), read(r);
writeln(solve());
return ;
}
BZOJ1218(线段树+扫描线)的更多相关文章
- 【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 ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- POJ1151+线段树+扫描线
/* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]
题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...
随机推荐
- POJ 2485 Highways(最小生成树+ 输出该最小生成树里的最长的边权)
...
- 关于git上传文件的一个小问题
*** Please tell me who you are. Run git config --global user.email "you@example.com" git c ...
- Git基本用法2
二.比较内容 1.比较提交 - Git Diff 现在我们对项目做些修改: $ cd gitproject # 向README文件添加一行 $ echo "new line" &g ...
- LC_MESSAGES、语言文件po和mo互相转换
LANGUAGE, LC_ALL, LC_MESSAGES, LANG zz- - 关于这几个环境变量一般认为它们的作用是用来指定程序用户界面语言而且这几个环境变量的优先级是从左到右依次降低的大概 ...
- Linux系统启动全过程
分为两部分,第一部分是硬件本身需要加载的信息,之后才是加载Linux相关信息,因为有装有双系统的机器嘛 1.计算机加电 2.BIOS开始运行,检测硬件:cpu.内存.硬盘等 3.BIOS读取CMOS存 ...
- spring : springmvc常用注解标签详解(转)
新的项目,新的学习,好久没用这些注解了,同时在学习使用shiro ,lucene 等等.在网上找了些博文,感谢作者的总结和分享. 欢迎交流,言归正传: 1.@Controller 在SpringMVC ...
- Request.UrlReferrer 实现页面刷新
在使用Ajax 异步提交表单的时候,需要返回某些状态信息.但如果把需要返回的如分页.过滤的参数写在控制器的参数里面,会比较繁琐. 因此,1.可以在控制器里面使用 Request 对象的请求的URL. ...
- docker三剑客之一docker compose
compose有两个重要的概念: 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker- ...
- sql语句之连表操作
内连接 select * from employee inner join department on employee.dep_id = department.id 左连接 在内连接的基础上保留左表 ...
- [CVE-2017-8464]Microsoft Windows远程命令执行漏洞复现
版权声明:本文为博主的原创文章,未经博主同意不得转载 前言 记录下自己的复现,保留意见 2017年6月13日,微软官方发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快 ...