基础数据结构->set&&map

set&&map

BEGIN:惜墨如金


set用法

基本用法

#include<bits/stdc++.h>
using namespace std;
void the_set()
{
    int x=404;
    set<int>ds;
    ds.insert(x);//如果在ds这个set 中无x,则插入;否则啥也不干
    ds.erase(x);//如果ds在这个set 中有x,则删除;否则不干
    auto it=ds.begin();
    ds.erase(it);//删除it指向元素
    ds.end();//last+1地址
    ds.begin();//
    /*int l1=*ds.lower_bound(x);//查询不小于x最小的数在集合中的地址,
                      //否则返回ds.end()
    int l2=*ds.upper_bound(x);//查询大于x最小的数在集合中的地址,
                      //无则返回ds.end()*/
	//以上代码有误
    int the_x_number=*ds.upper_bound(x)-*ds.lower_bound(x);
    //配合可以求出set中有多少x
    ds.size();//
    return;//OK
}
int main()
{
    the_set();
    return 0;
}

例题P5250

【深基17.例5】木材仓库

题目描述

博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是相同的。作为仓库负责人,你有时候会进货,有时候会出货,因此需要维护这个库存。有不超过 100000 条的操作:

  • 进货,格式1 Length:在仓库中放入一根长度为 Length(不超过 10⁹) 的木材。如果已经有相同长度的木材那么输出Already Exist
  • 出货,格式2 Length:从仓库中取出长度为 Length 的木材。如果没有刚好长度的木材,取出仓库中存在的和要求长度最接近的木材。如果有多根木材符合要求,取出比较短的一根。输出取出的木材长度。如果仓库是空的,输出Empty
输入格式
输出格式
样例 #1
样例输入 #1
7
1 1
1 5
1 3
2 3
2 3
2 3
2 3
样例输出 #1
3
1
5
Empty

思路

用set
这题前面可以用if(!ds.insert(a).second) cout<<"Already Exist"<<endl;一行搞定
后面则用lower_bound求出第一接近靠后值 与 第一接近靠前值比对

code_AC

#include<bits/stdc++.h>
using namespace std;
int ccc;
set<int>ds;
void inc(int a)
{
    //int num=*( ds.upper_bound(a)-ds.lower_bound(a) );
    if(!ds.insert(a).second) cout<<"Already Exist"<<endl;//这行代码借鉴的
    return;
}
void outc(int a)
{
    int num=*ds.upper_bound(a)-*ds.lower_bound(a);
    auto is=ds.lower_bound(a);
    if(!ds.size())
    {
        cout<<"Empty"<<endl;
        return;
    }
    if(num)
    {
        cout<<*is<<endl;
        ds.erase(is);
    }
    else
    {
        auto itis=ds.lower_bound(a),jtis=itis;
        if(jtis!=ds.begin()) --jtis;
        if(itis!=ds.end() && (a-(*jtis) > (*itis)-a)) 
            jtis=itis;
        cout<<(*jtis)<<endl;
        ds.erase(jtis);
    }
    return;
}
int main()
{
    cin>>ccc;
    for(int i=1;i<=ccc;i++)
    {
        int op;
        cin>>op;
        if(op==1)
        {
            int x;
            cin>>x;
            inc(x);
        }
        if(op==2)
        {
            int x;
            cin>>x;
            outc(x);
        }
    }
    return 0;
}

map用法

基本用法

#include<bits/stdc++.h>
using namespace std;
void the_map()
{
    map<string,int>ds;
    string kis="kis";
    ds[kis]=2;ds["a+a"]=3;ds["b+"]=4;ds["c-"]=5;//这样就可将这个“数组”赋值
    ds[kis];//查询ds[kis]的映射值
    cout<<ds[kis];//输出
    ds.end();
    auto isit=ds.begin();
    isit=ds.find("kis");//查询x在映射表中的地址
    ds.size();
    ds.erase("a+a");//删除下标为a+a的元素
    return;//OK
}
int main()
{
    the_map();
    return 0;
}

例题P5266

【深基17.例6】学籍管理

题目描述

您要设计一个学籍管理系统,最开始学籍数据是空的,然后该系统能够支持下面的操作(不超过 \(10^5\) 条):

  • 插入与修改,格式1 NAME SCORE:在系统中插入姓名为 NAME(由字母和数字组成不超过 20 个字符的字符串,区分大小写) ,分数为 SCORE (0 < SCORE < 2³¹) 的学生。如果已经有同名的学生则更新这名学生的成绩为 SCORE。如果成功插入或者修改则输出OK
  • 查询,格式2 NAME:在系统中查询姓名为 NAME 的学生的成绩。如果没能找到这名学生则输出Not found,否则输出该生成绩。
  • 删除,格式3 NAME:在系统中删除姓名为 NAME 的学生信息。如果没能找到这名学生则输出Not found,否则输出Deleted successfully
  • 汇总,格式4:输出系统中学生数量。
输入格式
输出格式
样例 #1
样例输入 #1
5
1 lxl 10
2 lxl
3 lxl
2 lxl
4
样例输出 #1
OK
10
Deleted successfully
Not found
0

思路

用一个map记录字符串与分数的对应关系
后面没有技术成分了
map模板题

code_AC

#include<bits/stdc++.h>
using namespace std;
int ccc;
map<string,int>stu;
int main()
{
    cin>>ccc;
    for(int i=1;i<=ccc;i++)
    {
        int kkk;cin>>kkk;
        if(kkk==1)//插入
        {
            string op;int score;
            cin>>op>>score;
            stu[op]=score;
            cout<<"OK"<<endl;
        }
        if(kkk==2)//查询
        {
            string op;cin>>op;
            auto isit=stu.find(op);
            if(isit==stu.end()) cout<<"Not found"<<endl;
            else cout<<stu[op]<<endl;
        }
        if(kkk==3)//删除
        {
            string op;cin>>op;
            auto isit=stu.find(op);
            if(isit==stu.end()) cout<<"Not found"<<endl;
            else
            {
                stu.erase(op);
                cout<<"Deleted successfully"<<endl;
            }
        }
        if(kkk==4) cout<<stu.size()<<endl;//汇总
    }
    return 0;
}
/*
思路
用一个map记录字符串与分数的对应关系
后面没有技术成分了
map模板题
*/

END 日有所进

posted @ 2024-02-29 22:27  左边之上  阅读(14)  评论(1)    收藏  举报