数据结构-BST UVA 11020

查找某一点其左下方没有其他点的点的个数

其实是平衡数的添加删除查找的操作,用系统自带的multiset自动完成该任务

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
const int inf=0x3f3f3f3f;
typedef long long ll;
struct Point
{
    int a,b;
    bool operator<(const Point &rhs)const
    {
        return a<rhs.a||(a==rhs.a&&b<rhs.b);
    }
};
multiset<Point>S;
multiset<Point>::iterator it;
int main()
{
    int T;
    scanf("%d",&T);
    for(int kase =1;kase<=T;kase++)
    {
        if(kase>1) printf("\n");
        printf("Case #%d:\n",kase);
        int n,a,b;
        scanf("%d",&n);
        S.clear();
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&a,&b);
            Point p = (Point){a,b};
            it = S.lower_bound(p);  //查找该点应该出现的位置
            if(it==S.begin()||(--it)->b>b)//如果set中没有点,或者前一个点的y值比当前值大,就插入该点
            {
                S.insert(p);
                it = S.upper_bound(p);
                while(it!=S.end() && it->b>=b) //对于所有比插入点大的点,如果他们的y值要比当前的y大,就删去该点
                {
                    S.erase(it++);
                }
            }
            printf("%d\n",S.size());

        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/becky_w/article/details/81236384