Senior’s Fish
原题网址
http://acm.hdu.edu.cn/showproblem.php?pid=5283
题目大意
池塘里有一些鱼和一个渔网,池塘可以看成一个二维的平面,而渔网可以看成一个与坐标轴平行的矩形。每条鱼都被给予了一个标号,分别从
1
到
还有询问操作:
输入格式
第一行包含一个整数
T
,表示测试数据组数。
对于每组测试数据:
第一行包含一个整数
第二行包含四个整数
x1
,
y1
,
x2
,
y2
,表示渔网的左下角坐标和右上角坐标。
接下来
n
行每行两个整数
接下来一行包含一个整数
m
,表示后面的事件数目。
接下来的
1
2
3
输出格式
对于每组数据的每个询问,输出一个整数表示对应的答案。
数据范围
对于30%的数据1≤
对于100%的数据1≤
题解
事先说明:这一题代码普遍很长。
首先我们看到数据范围中1≤
d
≤
用三棵线段树维护
x
,
区间[
l
,
询问时直接递归询问线段树累计答案即可。
主要的问题是修改,怎么修改呢?
如果某段区间加
k
,那么这段区间维护的那两个最大值也要加
这是我们看一下存不存在小于
x1
(
y1
)的最大值大于
x1
(
y1
),如果有,就说明至少存在一条原本横坐标(纵坐标)本来不属于合法范围内,后来又进入了合法范围的鱼,我们遍历一遍线段树,找到这条鱼,这条鱼的横坐标(纵坐标)刚刚进入了合法范围内,再看一下它的纵坐标(横坐标)是否已在合法范围内,是,就给对应区间答案加
1
,否则不加。
为了能够保证在找到这条鱼的时候这条鱼的横纵坐标已更新到最新,所以我们在遍历线段树的时候横纵坐标的标记都要下传。
然后再看一下有没有鱼因为这次修改游出了渔网,判断方法以及维护方法和上述方法差不多,最后把找到的鱼删除,具体实现为可以把它的横纵坐标赋值为超级小的值。
再看看时间复杂度,一条鱼至多游进合法范围