把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点。
那么所有有优势的点将会形成一条下凹的曲线。
因为可能有重点,用multiset,按照x优先,相同时再比较y的顺序排序,动态维护满足条件的总人数。
当新加的P点的y坐标大于左边的点的时候没有优势,忽略,用lower_bound判断一下。
当新加的P点有优势,但是可能使得其他的的点失去优势,依次把后面的点不满足条件的点删除。
红黑树好复杂。
#include<bits/stdc++.h> using namespace std; struct Point { int x,y; bool operator < (const Point & r) const { return x < r.x || ( x == r.x && y < r.y ); } }; multiset<Point> S; int main() { int T, kas = 0; scanf("%d",&T); while(T--){ if(kas) puts(""); int n; scanf("%d",&n); printf("Case #%d: ",++kas); S.clear(); while(n--){ Point P; scanf("%d%d",&P.x,&P.y); auto it = S.lower_bound(P); if(it == S.begin() || (--it)->y > P.y){ it = S.insert(P); while(it != S.end() && *it == P) it++; while(it != S.end() && it->y >= P.y) S.erase(it++); } printf("%d ",S.size()); } } return 0; }