维护一个集合,包含当前状态所有优势人群,则当前集合中元素一定呈“下凹函数”形态
每插入一个点P,比较P点与左侧相邻点y坐标,若P点y坐标大于左侧相邻点y坐标,则忽略(P点无优势),否则插入P点,将相对于P点无优势的点从集合中删除。删除点一定位于P点右上方。
查找过程使用STL中lower_bound
和upper_bound
函数
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <stdio.h>
using namespace std;
struct Point{
int x, y;
bool operator < (const Point& a) const{
return x < a.x || (x == a.x && y < a.y);
}
};
multiset<Point> s;
multiset<Point>::iterator it;
int main(){
int T;
scanf("%d", &T);
for(int i = 1; i <= T; i++){
if(i > 1) printf("\n");
printf("Case #%d:\n", i);
s.clear();
int n;
scanf("%d", &n);
while(n--){
int a, b;
scanf("%d%d", &a, &b);
Point P = (Point) {a, b};
it = s.lower_bound(P);
if(it == s.begin() || (--it) -> y > b){
s.insert(P);
it = s.upper_bound(P);
while(it != s.end() && it -> y >= b) s.erase(it++);
}
printf("%d\n", s.size());
}
}
return 0;
}