目录
- CDQ分治
- BZOJ1935 园丁的烦恼
- BZOJ1176 Mokia
- Distance(2019年牛客多校第八场D题+CDQ+树状数组)
- 线段树
- PUBG 1V3 CSUST2015
- Popping Balloons(2019年牛客多校第十场F题)
- Rikka with Cake(2019年杭电多校02)
最近经常遇到二维平面统计点的个数,稍微写个总结。
CDQ分治
BZOJ1935 园丁的烦恼
题目传送门
题解地址:
BZOJ1176 Mokia
题目传送门
题目链接:
Distance(2019年牛客多校第八场D题+CDQ+树状数组)
题解链接:
线段树
PUBG 1V3 CSUST2015
题目传送门
题意
故事是以吃鸡为背景的,总共有\(n\)个人,总共有\(m\)个队伍,每个人属于某一个队伍,每个队伍最多\(4\)个人。
每个人的攻击范围是一个\(|x-x_i|\leq d_i,|y-y_i|\leq d_i\)的正方形,现在告诉你每个人的坐标和攻击范围\(d_i\),及其所属的队伍编号。
现在有\(q\)次查询,每次给你一个队伍编号,问你这个队伍内攻击范围内敌人数最多的那个人对应攻击范围内的敌人数量。
思路
我的写法比较暴力,貌似比标程慢了很多。
我的写法是用线段树维护每个\(y\)上的人数,然后加点照常加,统计每个人攻击范围内的人时把他拆成\(x_i-d_i-1\)和\(x_i+d_i\),在\(x_i-d_i-1\)处减去\([y_i-d_i,y_i+d_i]\)内的人数,然后在\(x_i+d_i\)处加上这个范围的人数,就得到了横坐标在\([x_i-d_i,x_i+d_i]\)且纵坐标在\([y_i-d_i,y_i+d_i]\)内的人数,对于同一个队伍里面的人就暴力去重即可。
代码
#include
#include
Popping Balloons(2019年牛客多校第十场F题)
题目传送门
题意
在二维平面内有\(n\)个气球,玩家可以选择三条横线(相邻两条的距离恰好为\(r\))三条竖线(距离也为\(r\)),问你最多能打破多少个气球。
思路
我们用线段树来维护选择最下面的那个\(y\)时能打破的气球数量,然后枚举最左边的\(x\)来统计答案,在统计答案时我们先把这个\(x,x+r,x+2*r\)上的点全部去掉(去重),然后查询最大的\(y\)是多少加上这三条竖线上的点数即可。
代码
#include
#include
Rikka with Cake(2019年杭电多校02)
题目传送门
题意
在\(n\times m\)的平面内有\(k\)条射线,问你这些射线把这个平面分成了多少块。
思路
答案是交点数\(+1\)。
写法和上面两题差不多,按照\(x\)排序,线段树维护\(y\)。
代码
#include
#include