新年好呀,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的数放在第二大的位置上,保证前面的数小于此数,后面的数大于该数。
今天的复习就结束了,马上线性表洛谷就结束了,好开心呀,以后也应该将知识转换为系统知识,才能够在题目中更加灵活应用,慢慢进步,慢慢理解,加油,祝大家新年快乐!!!钟一淼新的一年继续进步。
明天复习贪心与排序!