算法进阶指南:基本数据结构0x12 队列

1.Team Queue

牛客竞赛-Team Queue

 AcWing-132. 小组队列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include<bitset>
#include<list> 
#include <algorithm>
#define pii pair<int,int>
#define pll pair<LL,LL>
#define pil pair<int,LL>
#define pli pair<LL,int>
#define pdd pair<db,db>
#define se second 
#define fi first
#define endl '\n'
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define MEM(a,x) memset(a,x,sizeof(a))
#define M(x) ((x)%MOD)
#define db double
#define eps 1e-9
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int MOD=9901;
const int N=1010;
map<int,int>gr;
queue<int>q[N];
queue<int>tot;
void solve()
{
	int T,num,_=0,x;
	while(cin>>T){
		if(T==0) break;
		cout<<"Scenario #"<<++_<<endl;
		rep(i,0,T){
			queue<int>().swap(q[i]);
			cin>>num;
			while(num--) cin>>x,gr[x]=i;
		}
		string s;
		while(cin>>s){
			if(s=="STOP") break;
			else if(s=="ENQUEUE"){
				cin>>x;
				int k=gr[x];
				if(q[k].size()==0) tot.push(k);
				q[k].push(x);
			}
			else{
				cout<<q[tot.front()].front()<<endl;
				q[tot.front()].pop();
				if(q[tot.front()].size()==0) tot.pop();
			}
		}
		cout<<endl;
		gr.clear();
		queue<int>().swap(tot);
	}
}
int main()
{
//	#ifndef ONLINE_JUDGE
//		freopen("title.in","r",stdin);
//		freopen("title.out","w",stdout);
//	#endif
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	//cin>>_; 
	while(_--){
		solve();
	}
	return 0;
}

2.蚯蚓

AcWing-133. 蚯蚓

牛客竞赛-[NOIP2016]蚯蚓

[NOIP2016 提高组] 蚯蚓 - 洛谷

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include<bitset>
#include<list> 
#include <algorithm>
#define pii pair<int,int>
#define pll pair<LL,LL>
#define pil pair<int,LL>
#define pli pair<LL,int>
#define pdd pair<db,db>
#define se second 
#define fi first
#define endl '\n'
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define MEM(a,x) memset(a,x,sizeof(a))
#define M(x) ((x)%MOD)
#define all(x) (x).begin(),(x).end()
#define db double
#define eps 1e-9
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int MOD=9901;
const int N=200010;
bool cmp(int a,int b)
{
	return a>b;
}
queue<LL>q[5];
void solve()
{
	int n,m,c,u,v,t;
	cin>>n>>m>>c>>u>>v>>t;
	vector<int>vc(n,0);
	rep(i,0,n) cin>>vc[i];
	sort(all(vc),cmp);
	for(auto i:vc) q[1].push(i);
	int del=0;
	vector<LL>res1,res2;
	rep(i,0,m){
		LL mx=-1e18;
		int k=0;
		rep(j,1,4) if(q[j].size()&&q[j].front()>mx) mx=q[j].front(),k=j;
		q[k].pop();
		mx+=del;
		res1.push_back(mx);
		q[2].push(mx*u/v-del-c),q[3].push(mx-mx*u/v-del-c);
		del+=c;
	}
	rep(i,1,4){
		while(q[i].size()) res2.push_back(q[i].front()+del),q[i].pop();
	}
	sort(all(res2),cmp);
	rep(i,0,res1.size()) if((i+1)%t==0) cout<<res1[i]<<" ";
	cout<<endl;
	rep(i,0,res2.size()) if((i+1)%t==0) cout<<res2[i]<<" ";
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

3.双端队列

134. 双端队列 - AcWing题库

牛客竞赛-双端队列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include<bitset>
#include<list> 
#include <algorithm>
#define pii pair<int,int>
#define pll pair<LL,LL>
#define pil pair<int,LL>
#define pli pair<LL,int>
#define pdd pair<db,db>
#define se second 
#define fi first
#define endl '\n'
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define MEM(a,x) memset(a,x,sizeof(a))
#define M(x) ((x)%MOD)
#define all(x) (x).begin(),(x).end()
#define db double
#define eps 1e-9
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int MOD=9901;
const int N=200010;
pii p[N];
void solve()
{
	int n;
	cin>>n;
	rep(i,0,n) cin>>p[i].fi,p[i].se=i;
	sort(p,p+n);
	int ans=1,lst=1e9,d=-1;
	rep(i,0,n){
		int j=i;
		while(j<n&&p[j].fi==p[i].fi) ++j;
		int mi=p[i].se,mx=p[j-1].se;
		if(d==-1){
			if(lst>mx) lst=mi;
			else d=1,lst=mx;
		}else{
			if(lst<mi) lst=mx;
			else ++ans,d=-1,lst=mi;
		}
		i=j-1;
	}
	cout<<ans<<endl;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

4.最大子序和

135. 最大子序和 - AcWing题库

牛客竞赛-最大子序和

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include<bitset>
#include<list> 
#include <algorithm>
#define pii pair<int,int>
#define pll pair<LL,LL>
#define pil pair<int,LL>
#define pli pair<LL,int>
#define pdd pair<db,db>
#define se second 
#define fi first
#define endl '\n'
#define rep(i,a,b) for (register int i=a;i<b;++i)
#define per(i,a,b) for (register int i=a;i>b;--i)
#define MEM(a,x) memset(a,x,sizeof(a))
#define M(x) ((x)%MOD)
#define all(x) (x).begin(),(x).end()
#define db double
#define eps 1e-9
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
const int MOD=9901;
const int N=300010;
int s[N],q[N];
void solve()
{
	int n,m;
	cin>>n>>m;
	rep(i,1,n+1) cin>>s[i],s[i]+=s[i-1];
	int ans=-2e9,hh=0,tt=0;
	rep(i,1,n+1){
		if(hh<=tt&&q[hh]<i-m) ++hh;
		if(ans<s[i]-s[q[hh]]) ans=s[i]-s[q[hh]];
		while(hh<=tt&&s[q[tt]]>=s[i]) --tt;
		q[++tt]=i;
	}
	cout<<ans;
}
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _=1;
	//cin>>_;
	while(_--){
		solve();
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值