2021算法竞赛入门班第三节课堆栈队列并查集等习题

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021算法竞赛入门班第三节课堆栈队列并查集等习题相关的知识,希望对你有一定的参考价值。

新建 Microsoft Office Word 文档【小根堆】


https://ac.nowcoder.com/acm/problem/17889
用小根堆来维护一个删除掉的编号,即现在剩余的编号。在用一个编号存目前最大的编号。
当小根堆内有元素就拿堆里的,没有的话就向后延申。

#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int>mp;
int n,idx=1; 
priority_queue<int,vector<int>,greater<int> >heap;
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++)
	
		string op; cin>>op;
		if(op=="New") 
		
			if(heap.size()) 
			
				cout<<heap.top()<<endl;
				mp[heap.top()]++,heap.pop();
			
			else 
			
				cout<<idx<<endl;
				mp[idx++]=1;
			
		
		else 
		
			int x; cin>>x;
			if(mp[x]) 
			
				puts("Successful");
				heap.push(x);
			
			else puts("Failed");
			mp[x]=0;
		
	
	return 0;

加边的无向图【并查集】


https://ac.nowcoder.com/acm/problem/14685
就是连通块的数量减1。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int p[N],n,m;
int find(int x)

	if(x!=p[x]) p[x]=find(p[x]);
	return p[x];

int main(void)

	cin>>n>>m;
	for(int i=1;i<=n;i++) p[i]=i;
	for(int i=1;i<=m;i++)
	
		int a,b; cin>>a>>b;
		p[find(b)]=find(a);
	
	map<int,int>mp;
	for(int i=1;i<=n;i++) mp[find(i)]++;
	cout<<mp.size()-1;
	return 0;

好串【栈 / 括号匹配】


https://ac.nowcoder.com/acm/problem/21874
很常见的一种括号匹配模型模型,不过这里的括号是ab而不是()而已。

#include<bits/stdc++.h>
using namespace std;
stack<char>st;
int main(void)

	string s; cin>>s;
	for(int i=0;i<s.size();i++)
	
		if(s[i]=='a'|| !st.size()) st.push(s[i]);
		else
		
			if(st.top()=='a'&&s[i]=='b') st.pop();
			else st.push(s[i]);
		
	
	if(st.size()) cout<<"Bad";
	else cout<<"Good";
	return 0;

[NOIP2004]合并果子【小根堆】


https://ac.nowcoder.com/acm/problem/16663

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int>>heap;
int n,x;
long long int sum;
int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>x,heap.push(x);
	while(heap.size()>1) 
	
		auto a=heap.top(); heap.pop();
		auto b=heap.top(); heap.pop();
		sum+=a+b;
		heap.push(a+b);
	
	cout<<sum<<endl;
	return 0;

DongDong认亲戚【并查集】


https://ac.nowcoder.com/acm/problem/23803

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
unordered_map<string,int>hush;
int p[N],idx;
int find(int x)

	if(x!=p[x]) p[x]=find(p[x]);
	return p[x];

int get(string x)

	if(!hush.count(x)) hush[x]=idx,p[idx]=idx,idx++; 
	return hush[x];

int n,m;
int main(void)

	cin>>n>>m;
	for(int i=0;i<n;i++)
	
		string s; cin>>s;
		get(s);
	
	while(m--)
	
		int op;  
		string s1,s2; cin>>op>>s1>>s2;
		if(op==1)
		
			p[find(get(s2))]=find(get(s1));
		else
		
			if(find(get(s1))==find(get(s2)))  cout<<1<<endl;
			else cout<<0<<endl;
		
	
	return 0;

以上是关于2021算法竞赛入门班第三节课堆栈队列并查集等习题的主要内容,如果未能解决你的问题,请参考以下文章

2021算法竞赛入门班第一节课枚举贪心习题

2021算法竞赛入门班第四节课搜索练习题

2021算法竞赛入门班第七节课图论练习题

2021算法竞赛入门班第九节课线段树练习题

2021算法竞赛入门班第二节课递归分治二分练习题

2021算法竞赛入门班第十节课字符串练习题