3.20模拟赛(T3)&set容器的使用
set 是 STL 中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在 set 中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用 multiset。
这题考了STL的使用——set。
T3 踮脚顾盼梨园

set 的常用操作
| 1 | //头文件 | 
本题代码。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using namespace std;
inline ll read() {
    ll ans=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') {f=-1;}ch=getchar();}
    while(ch>='0'&&ch<='9') {ans=ans*10+ch-48;ch=getchar();}
    return ans*f;
}
void write(ll x){
    if(x<0){putchar('-');x=-x;}
    if(x>9){write(x/10);}
    putchar(x%10|48);
}
struct node{
    int l,r;
    bool operator <(const node &oth)const{
        return r<oth.l;//重载小于号为右端点与左端点的大小关系 
    }
};
set<node> S; //"set"容器,为集合,实现方式为红黑树,是一种自平衡二叉查找树。它的查找,删除,插入时间为O(log n) 
set<node>::iterator it;//iterator迭代器,用来访问set容器 
char opt;
int n;
int main() {
    freopen("shi.in","r",stdin);
    freopen("shi.out","w",stdout);
    n=read();
    while(n--){
        scanf(" %c",&opt);
        if(opt=='A'){
            int ans=0;
            int l=read(),r=read();//区间长度 
            node temp=(node){
                l,r
            };
            for (it=S.find(temp);it!=S.end();it=S.find(temp)){//find函数用于返回一个迭代器,当这个元素与temp这个元素重合时,若为空返回容器末尾迭代器'S.end' 
                S.erase(it);//弹出该元素 
                ans++;//统计弹出元素数量 
            }
            S.insert(temp);//插入该元素 
            write(ans);
            puts("");
        }else{
            write(S.size());//S.size为该容器内元素个数。 
            puts("");
        }
    }
    return 0;
}

