UVA 110020 Efficient Solutions (STL)

把一个人看出一个二维的点,优势的点就是就原点为左下角,这个点为右上角的矩形,包含除了右上角以外边界,其他任意地方不存在点。

那么所有有优势的点将会形成一条下凹的曲线。

因为可能有重点,用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;
}
原文地址:https://www.cnblogs.com/jerryRey/p/4803715.html