数据结构与STL库


其中有几个常见又好用的容器:stack(栈),vector(动态数组),set(集合),map(映射)。
1.栈(stack)

image
image
做一道与栈有关的题目:

验证栈序列

时空限制:1s,512MB

题目描述:

给出 pushed 和 poped 两个序列,其取值从 1 到 n(n≤100000)。

已知入栈序列是 pushed,如果出栈序列有可能是 poped,则输出 Yes,否则输出 No。

每个测试点有多组数据。

输入格式:

第一行输入一个正整数 T,表示数据组数。

对于每组数据,第一行输入一个正整数 n;

第二行输入 n 个正整数,表示入栈序列;

第三行输入 n 个正整数,表示出栈序列。

输出格式:

对于每组数据单独输出一行 Yes 或 No。

样例输入:

2 5 1 2 3 4 5 4 5 3 2 1 5 1 2 3 4 5 3 5 2 4 1

样例输出:

Yes No

数据规模:

n ≤ 100000




伪代码:

2.队列(queue)

image



做一道与队列有关的题:

合并果子

时间限制:1s 空间限制:128M

题目描述:

在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了 n 堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过 n−1 次合并之后, 就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为 1 ,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

例如有 3 种果子,数目依次为 1 , 2 , 9 。可以先将 1 、 2 堆合并,新堆数目为 3 ,耗费体力为 3 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 ,耗费体力为 12 。所以多多总共耗费体力 3+12=15 。可以证明 15 为最小的体力耗费值。

输入格式:

第一行是一个整数 n(1≤n≤1e5),表示果子的种类数。

第二行包含 n 个整数,用空格分隔,第 i 个整数 ai(1≤ai≤1e9) 是第 i 种果子的数目。

输出格式:

一个整数,也就是最小的体力耗费值。

样例输入:

3 1 2 9

样例输出:

15

#include <bits/stdc++.h>
using namespace std;
long long n,x,y,a,ans;
priority_queue<int,vector<int>,greater<int> > que;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a);
		que.push(a);
	}
	while(!que.empty()){
		if(que.size()==1){
			break;
		}
		x=que.top();
		que.pop();
		y=que.top();
		que.pop();
		ans+=x+y;
		que.push(x+y);
	}
	printf("%lld",ans);
	return 0;
}

3.动态数组(vector)
定义


初始化
image
vector一般有两种访问方式:
image



做一道与动态数组有关的题目:

矩阵

时间限制:1s 空间限制:512M

题目描述:

给定一个 n×m 的矩阵,给定 q 组询问,每组询问输入两个数 x 和 y,表示查询矩阵 x 行 y 列的元素是什么。

输入格式:

第一行三个正整数 n, m, q;

接下来 n 行,每行 m 个正整数,表示矩阵中的元素。其中第 i 行第 j 列的元素表示 ai−1,j−1。

接下来 q 行,每行两个正整数 x, y,表示询问第 x 行第 y 列的元素是什么。保证 0≤x

样例输入:

3 4 2 1 2 3 4 5 6 7 8 9 10 11 12 1 3 0 2

样例输出:

8 3

数据规模:

1≤n,m,q≤105, 1≤n⋅m≤105,0<ai,j<109
伪代码:


4.set




image

image

5.映射(map)




4 个赞