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 ;
}

最新文章

  1. select初始化添加option,通过标签给出回显值,由于回显值和初始化值option中有一个值重复,去重等问题!
  2. CACTI表结构和数据被动获取
  3. ViewFlipper(翻转视图)的使用
  4. ITextSharp导出PDF表格和图片(C#)
  5. 免费 PSD 素材:25个全新的界面设计资源
  6. 50136142WXY的百度地图
  7. QT进度条QProgressBar的练习(定制QProgressBar,单独成为一个控件)
  8. C#学习笔记4:关键词大小写、复合格式化等
  9. mysql 创建用户与授权、修改密码
  10. JavaScript在智能手机上的应用-通过滑动修改网页字体大小
  11. Java的类C结构体的实现,以及对类的某一属性进行排序
  12. C++笔记010:C++对C的扩展——register关键字增强
  13. NoSQL数据库之Redis数据库:Redis的介绍与安装部署
  14. Git Learning2 GitHub upload
  15. JDK1.5新特性,基础类库篇,集合框架(Collections)
  16. React Native 的组件之底部导航栏 TabBarIOS(一)
  17. 22.线程通信Condition
  18. ambassador 学习一基本试用
  19. win10 设置C盘访问权限
  20. jQuery:mouseover and Increase the Size of an Image

热门文章

  1. Linux下配置Objective-C编译环境
  2. android——array中设置选项
  3. 使用eclipse的SVN连接码云
  4. Derived 派生类
  5. Linux-内存进程和软件安装
  6. adb pull / push
  7. darknet源码学习
  8. HDU2087(KMP入门题)
  9. 蓝桥杯 2014本科C++ B组 李白打酒 三种实现方法 枚举/递归
  10. java 关于getProperty()方法中反斜杠问题