算法基础——栈,优先队列,map,set,bitset

目录

1.栈

例题:火车轨道

2.优先队列

例题:小e的菜篮子

3.map

例题:气球数量

4.set

例题:【模板】排序(1)

5.bitset

例题:数的种类


1.栈

栈是一个先进后出的结构

例题:火车轨道

注意:至多只进一次栈

详解在这里:http://t.csdnimg.cn/ZSd83 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1e5 + 10;
int a[N];

int main()
{
	stack<int> stk;
	int n;
	cin >> n;
	int sta = 1;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = 1; i <= n; i++)
	{
		while(sta <= n &&(stk.empty() || stk.top() != i))
			stk.push(a[sta++]);
		
		if(stk.top() == i)
			stk.pop();
	}
	if(stk.empty())
		cout << "Yes";
	else
		cout << "No";
	return 0;
}

2.优先队列

内部不能访问 ,默认是大根堆永远能保证最顶端的那个最大,priority_queue

可以pop弹出堆顶,top访问堆顶,size访问元素个数,push推入

例题:小e的菜篮子

#include<bits/stdc++.h>
using namespace std;
using ll = long long;


int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	priority_queue<int> pque;
	ll q,x;
	cin >> q;
	ll ans = 0;
	while(q--)
	{
		int flag;
		cin >> flag;
		if(flag == 1)
		{
			cin >> x;
			pque.push(x);
			ans += x;
		}
		else if(flag == 2 && pque.size())
		{
			ans -= pque.top();
			pque.pop();
		}
	}
	
	cout << ans;
	return 0;
}

3.map

map和数组类似,如果说数组是值与值之间的对应,那么map就是key和value之间的对应,key和value的类型都是我们自己可以控制的,可以是字符串,也可以是int或者double类型的

map默认键是从小到大的

例题:气球数量

 

vector是保证字符串的顺序正确 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1e5 + 10;
int a[N];

int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n;
		cin >> n;
		
		map<string,int> mp;
	    vector<string> v;
	    
		while(n--)
		{
			string s;
			cin >> s;
			mp[s]++;
			if(mp[s] == 1)
				v.push_back(s);
		}
		for(auto &ele : v)
			cout << ele << ' ' << mp[ele] << '\n';
	}
	return 0;
}

4.set

默认从小到大,且会自动去重,可用insert进行插入值

例题:【模板】排序(1)

用于排序去重 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1e5 + 10;
int a[N];

int main()
{
	int n;
	cin >> n;
	
	set<ll> st;
	
	while(n--)
	{
		ll x;
		cin >> x;
		st.insert(x);
	}
	
		for(auto &ele : st)
			cout << ele << ' ';
			
	return 0;
}

5.bitset

是一个有很多位的二进制数,支持位运算

右边是低位,左边是高位

可以用count返回1的个数,reset重新全部变为0,可以就把它当成一个bool数组用

例题:数的种类

 

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e5 + 10;

int main()
{
	int n;
	cin >> n;
	
	bitset<N> bs;
	bs[0] = 1;
	
	for(int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		bs |= (bs << x);
	}
	cout << bs.count() << '\n';
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏箱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值