下面搜到的set的一些说明在这里搜到的
       http://blog.csdn.net/xuruoxin/article/details/12654093
 
 Code  
set的基本操作:
begin()         返回指向第一个元素的迭代器
clear()         清除所有元素
count()         返回某个值元素的个数
empty()         如果集合为空,返回true
end()           返回指向最后一个元素的迭代器
equal_range()   返回集合中与给定值相等的上下限的两个迭代器
erase()         删除集合中的元素
find()          返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert()        在集合中插入元素
lower_bound()   返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()      返回一个用于元素间值比较的函数
max_size()      返回集合能容纳的元素的最大限值
rbegin()        返回指向集合中最后一个元素的反向迭代器
rend()          返回指向集合中第一个元素的反向迭代器
size()          集合中元素的数目
swap()          交换两个集合变量
upper_bound()   返回大于某个值元素的迭代器
value_comp()    返回一个用于比较元素间的值的函数
Code  
set的基本操作:
begin()         返回指向第一个元素的迭代器
clear()         清除所有元素
count()         返回某个值元素的个数
empty()         如果集合为空,返回true
end()           返回指向最后一个元素的迭代器
equal_range()   返回集合中与给定值相等的上下限的两个迭代器
erase()         删除集合中的元素
find()          返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert()        在集合中插入元素
lower_bound()   返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()      返回一个用于元素间值比较的函数
max_size()      返回集合能容纳的元素的最大限值
rbegin()        返回指向集合中最后一个元素的反向迭代器
rend()          返回指向集合中第一个元素的反向迭代器
size()          集合中元素的数目
swap()          交换两个集合变量
upper_bound()   返回大于某个值元素的迭代器
value_comp()    返回一个用于比较元素间的值的函数
      然后写了白书上的一个例题(UVa11020),书上写的比较详细,有一点没有说明(其实也挺直观的。。。),就是在删除时只需要扫描到第一个纵坐标小于当前插入的点的点就可以停止了,因为set维护的都是优势点,所以y坐标按着这玩意的性质应该是递减的。

 Code
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
struct Point{
    int x,y;
    bool operator < (const Point& rhs) const{
        return (x==rhs.x)?(y<rhs.y):(x<rhs.x);
    }
};
multiset<Point> S;
multiset<Point>::iterator ite;
int T,n,x,y;
int main()
{
    scanf("%d",&T);
    for(int t=0;t<T;t++){
        scanf("%d",&n);
        if(t>0)printf("\n");
        printf("Case #%d:\n",t+1);
        S.clear();
        for(int i=0;i<n;i++){
            cin>>x>>y;
            Point P=(Point){x,y};
            ite=S.lower_bound(P);
            if((ite!=S.begin())&&
               ((--ite)->y<=y)){
                printf("%d\n",S.size());
                continue;
            }
            S.insert(P);
            ite=S.upper_bound(P);
            while((ite!=S.end())&&
                  (ite->y>=y) )
                S.erase(ite++);
            printf("%d\n",S.size());
        }
    }
    return 0;
}
Code
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
struct Point{
    int x,y;
    bool operator < (const Point& rhs) const{
        return (x==rhs.x)?(y<rhs.y):(x<rhs.x);
    }
};
multiset<Point> S;
multiset<Point>::iterator ite;
int T,n,x,y;
int main()
{
    scanf("%d",&T);
    for(int t=0;t<T;t++){
        scanf("%d",&n);
        if(t>0)printf("\n");
        printf("Case #%d:\n",t+1);
        S.clear();
        for(int i=0;i<n;i++){
            cin>>x>>y;
            Point P=(Point){x,y};
            ite=S.lower_bound(P);
            if((ite!=S.begin())&&
               ((--ite)->y<=y)){
                printf("%d\n",S.size());
                continue;
            }
            S.insert(P);
            ite=S.upper_bound(P);
            while((ite!=S.end())&&
                  (ite->y>=y) )
                S.erase(ite++);
            printf("%d\n",S.size());
        }
    }
    return 0;
}