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坐标建立线段树 对全部的点和询 ...
随机推荐
- 理解vue ssr原理,自己搭建简单的ssr框架
前言 大多数Vue项目要支持SSR应该是为了SEO考虑,毕竟对于WEB应用来说,搜索引擎是一个很大的流量入口.Vue SSR现在已经比较成熟了,但是如果是把一个SPA应用改造成SSR应用,成本还是有些 ...
- css中IE判断语句 if !IE
1. <!–[if !IE]><!–> 除IE外都可识别 <!–<![endif]–> 2. <!–[if IE]> 所有的IE可识别 <! ...
- XML与TreeView
1.treeview代码书写 private void Form1_Load(object sender, EventArgs e) { //代码为TreeView添加子项 treeView1.Con ...
- hdu-5670 Machine(水题附上java代码)
题目链接: Machine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描 ...
- 动态调试Android程序
最近好几天来一直在看动态调试.首先是这一篇(http://www.52pojie.cn/forum.php?mod=viewthread&tid=293648)里面介绍了多种IDA动态调试的情 ...
- CodeForces669E:Little Artem and Time Machine(CDQ分治)(或者用map+树状数组优美地解决)
Little Artem has invented a time machine! He could go anywhere in time, but all his thoughts of cour ...
- python 复制文件流程
例子代码: [root@master script]# vim copy_file.py #!/usr/bin/python # -*- coding:utf-8 -*- old_file_name ...
- python 基础之第十二天(re正则,socket模块)
In [14]: 'hello-wold.tar.gz'.split('.') Out[14]: ['hello-wold', 'tar', 'gz'] In [15]: import re In [ ...
- Win32环境下代码注入与API钩子的实现
本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在VS下编写和调试Win32应用程序和动态链接库 ...
- CSS:CSS cursor 属性
ylbtech-CSS:CSS cursor 属性 1.返回顶部 1. 实例 一些不同的光标: span.crosshair {cursor:crosshair;} span.help {cursor ...