baritone
上低音号
【题目描述】
黄前久美子是一名上低音号手。这天,一共有n名上低音号手参加演出。演出的场地是一个r行c列的矩阵,每名上低音号手都在其中一个方格内,且没有两个人在同一个方格。
摄影师为这次演出拍摄了许许多多的照片,每张照片都是一个边框平行于坐标轴的矩形。久美子希望照片中能出现尽量多的上低音号手——具体地,如果一张照片出现了超过k名上低音号手,那么久美子会很喜欢这张照片。
那么,究竟能拍出多少张不同的久美子喜爱的照片呢?
【输入格式】
第一行四个整数r,c,n,k。
接下来n行,每行两个数x,y,表示一名在第x行第y列的上低音号手。保证数对(x,y)不重复出现。
【输出格式】
输出一行一个整数,表示可以拍出的久美子喜爱的照片数量。
【样例数据】
baritone1.in
2 2 1 1
1 2
baritone1.out
4
baritone2.in
3 2 3 3
1 1
3 1
2 2
baritone2.out
1
baritone3.in
3 2 3 2
1 1
3 1
2 2
baritone3.out
4
baritone4.in
1 1 1 1
1 1
baritone4.out
1
【数据范围】
对于30%的数据,n,r,c≤500。
对于另30%的数据,k≤3。
对于100%的数据,1≤n,r,c≤3000,1≤k≤10。
思路:
从上往下枚举上边界,从下往上枚举下边界。
考虑已经统计出上下边界为枚举的包含至少k 个点的矩形数,当下边界往上移动时,可能会删除某些点。
用按横坐标排序的有序表维护当前上下边界间的点,只有删除点的前k 个点和后k个点会影响答案,其它矩形区域依然可行。
这样每次只需要从有序表中删除一个点并统计答案,使用链表即可。
复杂度O( n^2*k )。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <iostream>