0
点赞
收藏
分享

微信扫一扫

STL数据库复习

言午栩 2022-02-02 阅读 104

        新年好呀,2022年的第一篇博客,主要是我太不爱总结了,所以要多看多总结才行,那就开始是今天的复习了!

1.vector

vector<int>a;
a.push_back();
a.pop_back();
a.insert(a.begin() + i, k);//从第i个位置插入
for (vector<int>::iterator i = a.begin(); i != a.end(); i++) {
        cout << *i << endl;
    }//打印vector需要使用迭代
//原先都不知道

P3156 【深基15.例1】询问学号

题目描述

有 n(n \le 2 \times 10^6)n(n≤2×106) 名同学陆陆续续进入教室。我们知道每名同学的学号(在 1 到 10^9109 之间),按进教室的顺序给出。上课了,老师想知道第 ii 个进入教室的同学的学号是什么(最先进入教室的同学 i=1i=1),询问次数不超过 10^5105 次。

输入格式

第一行 2 个整数 n 和 m,表示学生个数和询问次数。

第二行 n 个整数,表示按顺序进入教室的学号。

第三行 m 个整数,表示询问第几个进入教室的同学。

输出格式

m 个整数表示答案,用换行隔开。

输入输出样例

输入 #1复制

10 3
1 9 2 60 8 17 11 4 5 14
1 5 9

输出 #1复制

1
8
5

        非常简单的一道题目,输入元素压入vector,在输出即可

#include <iostream>
#include <vector>
using namespace std;
vector<int>vec;
int main()
{
	int n, m;
	int t;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> t;
		vec.push_back(t);
	}
	for (int i = 1; i <= m; i++) {
		cin >> t;
		cout << vec[t-1] << endl;
	}
}

2.stack

        先进后出:基本操作也都是常规操作,这个比较熟,所以就看一下例题就行。

P1241 括号序列

题目描述

定义如下规则序列(字符串):

1.空序列是规则序列;

2.如果S是规则序列,那么(S)和[S]也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

(),[],(()),([]),()[],()[()]

而以下几个则不是:

(,[,],)(,()),([()

现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。

输入格式

输入文件仅一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,长度不超过100。

输出格式

输出文件也仅有一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,把你补全后的规则序列输出即可。

输入输出样例

输入 #1复制

([()

输出 #1复制

()[]()

说明/提示

将前两个左括号补全即可。

#include <iostream>
#include <stack>
using namespace std;
stack<int>v;
string s, b;
int main()
{
    cin >> s;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == '(') {
            b[i] = ')';
            v.push(i);
        }
        if (s[i] == '[') {
            b[i] = ']';
            v.push(i);//将带有标记的i压入栈中
        }
        if (s[i] == ')' || s[i] == ']') {
            if (v.empty() || b[v.top()] != s[i]) {
                if (s[i] == ')') {
                    b[i] = '(';
                }
                else {
                    b[i] = '[';
                }
            }
            else {//如果相等的话,就在b数组内转化为‘ ’,再删除栈顶
                b[v.top()] = ' '; v.pop();
            }
        }
    }
    for (int i = 0; i < s.size(); i++) {
        if (b[i] == '(' || b[i] == '[') {
            cout << b[i];
        }
        cout << s[i];//输出原序列
        if (b[i] == ')' || b[i] == ']') {
            cout << b[i];
        }
    }
}

3.queue

        先进先出(本人比较会,所以还是请看例题)

P2058 [NOIP2016 普及组] 海港

题目描述

小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。

小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘 客数k_iki​,以及每名乘客的国籍 x_{i,1}, x_{i,2},…,x_{i,k}xi,1​,xi,2​,…,xi,k​。

小K统计了nn艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的2424小时(2424小时=8640086400秒)内所有乘船到达的乘客来自多少个不同的国家。

形式化地讲,你需要计算nn条信息。对于输出的第ii条信息,你需要统计满足t_i-86400<t_p \le t_iti​−86400<tp​≤ti​的船只pp,在所有的x_{p,j}xp,j​中,总共有多少个不同的数。

输入格式

第一行输入一个正整数nn,表示小K统计了nn艘船的信息。

接下来nn行,每行描述一艘船的信息:前两个整数t_iti​和k_iki​分别表示这艘船到达海港的时间和船上的乘客数量,接下来k_iki​个整数x_{i,j}xi,j​表示船上乘客的国籍。

保证输入的t_iti​是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在第t_iti​秒到达海港。

保证 1 \le n \le 10^51≤n≤105,\sum{k_i} \le 3*10^5∑ki​≤3∗105 ,1\le x_{i,j} \le 10^51≤xi,j​≤105, 1 \le t_{i-1}\le t_i \le 10^91≤ti−1​≤ti​≤109。

其中\sum{k_i}∑ki​表示所有的k_iki​的和。

输出格式

输出nn行,第ii行输出一个整数表示第ii艘船到达后的统计信息。

输入输出样例

输入 #1复制

3
1 4 4 1 2 2
2 2 2 3
10 1 3

输出 #1复制

3
4
4

输入 #2复制

4
1 4 1 2 2 3
3 2 2 3
86401 2 3 4
86402 1 5

输出 #2复制

3
3
3
4
#include <iostream>
#include <queue>
using namespace std;
struct node {
    int t;
    int x;
};
queue<node>v;
int n, m, t, b;
int ans = 0;
int a[1001000];//数组需要开的大一些
node k;
int main()
{
    cin >> n;
    while (n--) {
        cin >> t >> m;
        while (!v.empty()) {
             k = v.front();//取队列队首
            if (k.t + 86400 <= t) {
                a[k.x]--;
                if (a[k.x] == 0) {
                    ans--;//没有了该国国籍的人,该国国籍的人-1
                }
                v.pop();
                continue;//跳过本次循环,进入下一次循环
            }
            break;
        }
        for (int i = 1; i <= m; i++) {
            cin >> b;
            k.t = t; k.x = b;
            v.push(k);
            a[k.x]++;//该数出现过次数加1
            if (a[k.x] == 1) {
                ans++;
            }
        }
        cout << ans << endl;
    }
}

4.dueue

5.priority_queue

6.list//链表

push_back(x);//在容器尾部加入一个元素
pop_back();//删除容器中最后一个元素
push_front(x);//在容器开头插入一个元素
pop_front();//从容器开头移除第一个元素
insert(a,b);//在a位置插b元素的拷贝,返回新数据的位置。
clear();//移除容器的所有数据
erase(begin,end);//删除[begin,end)区间的数据,返回下一个数据的位置。
erase(a);//删除a位置的数据,返回下一个数据的位置。
remove(a);//删除容器中所有与a值匹配的元素。

7.set(multiset)

8.map(multimap)

9.algorithm//头文件

max();
min();
abs();
swap(a,b)
reverse(a.begin(),a.end())//翻转函数
sort(a,b,cmp)
unique()//去重函数,在sort后使用
find(x)//如果有x,返回x的位置,如果没有则返回n+1的下标
upper_bound(x);//返回第一个大于x的下标的位置
lower_bound(x);//返回第一个大于等于x下标的位置
fill();//填充区间内的函数
count(a,a+n,b);//计算区间内b的个数
__gcd(a,b)//求最大公因数
next_permutation(a,a+n)//全排列
nth_element(a.begin(),a.begin()+2,a.end())//把原先位置为2的数放在第二大的位置上,保证前面的数小于此数,后面的数大于该数。

        今天的复习就结束了,马上线性表洛谷就结束了,好开心呀,以后也应该将知识转换为系统知识,才能够在题目中更加灵活应用,慢慢进步,慢慢理解,加油,祝大家新年快乐!!!钟一淼新的一年继续进步。

        明天复习贪心与排序!

举报

相关推荐

0 条评论