Dima and Containers CodeForces - 358C
阿新 • • 發佈:2021-08-10
原題連結
考察:模擬,貪心
思路:
萬惡的模擬+離線處理題.
對於相鄰的0之間的數字,最大的放在stack
裡,其次在佇列,最後在雙端佇列.
要注意的是可能末尾沒有0
Code
#include <iostream> #include <cstring> #include <stack> #include <queue> #include <deque> #include <string> #include <algorithm> using namespace std; const int N = 100010; int n,op,a[N]; string ans[N]; struct Node{ int id,val; bool operator<(const Node& x){ return this->val<x.val; } }node[N]; void Myprintf(int cnt,int pos) { if(!cnt) {puts("0");return;} sort(node+1,node+cnt+1); if(cnt==1) { puts("pushStack"); if(!pos) puts("1 popStack"); return; } if(cnt==2) { printf("pushStack\npushQueue\n"); if(!pos) printf("2 popStack popQueue\n"); return; } ans[node[cnt].id] = "pushStack"; ans[node[cnt-1].id] = "pushQueue"; ans[node[cnt-2].id] = "pushFront"; for(int i=cnt-3;i>=1;i--) ans[node[i].id] = "pushBack"; for(int i=1;i<=cnt;i++) printf("%s\n",ans[i].c_str()); if(!pos) printf("3 popStack popQueue popFront\n"); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int cnt = 0; for(int i=1;i<=n;i++) { if(a[i]) { cnt++; node[cnt].id = cnt; node[cnt].val = a[i]; }else{ Myprintf(cnt,a[i]); cnt = 0; } } if(cnt) Myprintf(cnt,1); return 0; }