[CERC2015]奶牛围栏
问题描述
一个10^6行10^6列的网格图,上面有一些牛、花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,牛也不能穿过围栏和地图边界,求每头牛它能到达的花的数量。注意栅栏不会相交
.png)
输入格式
第一行一个数f表示矩形围栏的数量。
接下来f行,每行四个数x1,y1,x2,y2,表示(x1,y1)在围栏内部矩形的左上角,(x2,y2)在右下角。
接下来一行一个数m表示花的数量。
接下来m行每行两个数x,y,表示在(x,y)处有一朵花。
接下来一行一个数n表示牛的数量。
接下来n行每行两个数x,y,表示在(x,y)处有一头牛。
输出格式
总共n行,每行一个数ans,第i个数表示第i头牛能到ans个花。
样例输入
4
2 2 8 4
1 9 4 10
6 7 9 9
3 3 7 3
9
3 4
8 4
11 5
10 7
10 8
9 8
2 8
4 11
9 11
8
1 1
5 10
6 9
3 7
7 1
4 2
7 5
3 3
样例输出
5
1
0
1
3
1
3
0
由于每头牛只能往右或往下走,我们考虑从右往左扫描,令$f[i]$表示扫描到当前$x$坐标时,纵坐标为$i$的位置能到的花的数目,那么考虑维护$f[i]$,发现不是很好维护,令$g[i]=f[i]-f[i+1]$,考虑来维护$g[i]$
如果遇到一朵花,就是单点修改,如果遇到右栅栏$[l,r]$,那么就是将$[l,p]$(p为$l$下方第一个栅栏的位置)区间的和加到$g[l-1]$上,然后记录一下当前$[r+1,p]$的和$res[i]$,再清空$[l,r]$
如果遇到左栅栏$[l,r]$,就清空$[l,r]$区间,然后在$l-1$位置减去先前记录的$res[i]$,这个画个图就能看出来此时$res[i]$被重复计算了一次,因此要减掉。
如果遇到牛$x$,就是查询$[x,p]$的和,因此只需要扫描线时用线段树来维护$g[i]$即可。
这题疑似数据和描述不清,特别注意排序顺序。
代码:
1 |
|