题意: 有3种数据结果,Queue,Stack,Deck(两端插入) 和 Q次操作
操作1:把数字x压入3种数据结构中的其中一种.
操作2: 遇到输入x==0 将弹出3个数据结构中的非受限端 (Queue为队头,Stack为栈顶).并且清空该数据结构.(Deck 只能选其中一端) 并且要求每次操作2弹出的数之和要最大.
1<=Q,x<=1e6.
每遇到操作2后 所用数据都清空 所以将两个0之间的数 分开来考虑.
因为Deck只能弹出一个数 所以可以选择其一端放没用的数 .那么显然可以每次遇到操作2都弹出前3大的数.
最大放queue,次大放stack,第三大放Front 剩余的都放Back. 用vector模拟一下即可.
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> ii;
const int N=2e+5;
int mk[5];
vector<ii> v;
string s[4]={"Queue","Stack","Front","Back"};
bool cmp(ii a,ii b)
{
return a.se<b.se;
}
void calc()
{
int ans=0;
vector<int> res(v.size());
sort(v.begin(),v.end());
reverse(v.begin(),v.end());
for(int i=0;i<v.size();i++)
res[v[i].se]=3;
for(int i=0;i<min(3,(int)v.