链接:https://www.nowcoder.com/acm/contest/131/A来源:牛客网
ZZT 创造了一个队列 Q。这个队列包含了 N 个元素,队列中的第 i 个元素用 Q i 表示。Q 1 表示队头元素,Q N 表示队尾元素。队列中的元素是 N 的一个全排列。 ZZT 需要在这个队列上执行 P 次操作,操作分两种: FIRST X: 将元素 X 移到队头。 LAST X: 将元素 X 移到队尾。 在 P 次操作之后,ZZT 想知道队列中的元素的排列方式,由于他最近很忙,因此需要请你帮他解决这个问题。一道比较有意思的题目,前期一直是正向考虑。然后5%-10%。后来想通了,直接倒着查询,判断这个数最终是放到前面还是后面了,标记一下储存到不同的记录数组,然后按顺序输出即可(FIRST的话是越往后的在前面,LAST的话是越往前越在后面,未标记的按照顺序输出)。
#include<bits/stdc++.h> using namespace std; #define MAXN 1000500 int a[MAXN]; stack<int> sta; string s[MAXN]; int re[MAXN]; int fst[MAXN]; int last[MAXN]; int vis[MAXN]; int ans[MAXN]; int main() { ios::sync_with_stdio(0); int n,q; int cnt=0; int bis=0; int cas=0; int k=0; int num; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } cin>>q; for(int i=0;i<q;i++) { cin>>s[i]>>re[i]; } for(int i=q-1;i>=0;i--) { if(s[i]=="FIRST"&&!vis[re[i]]) { vis[re[i]]=1; fst[cnt++]=re[i]; } else if(s[i]=="LAST"&&!vis[re[i]]) { vis[re[i]]=1; last[cas++]=re[i]; } } for(int i=0;i<n;i++) { if(!vis[a[i]]) ans[bis++]=a[i]; } if(bis||cas) { for(int i=0;i<cnt;i++) cout<<fst[i]<<" "; } else { for(int i=0;i<cnt;i++) { if(i==cnt-1) cout<<fst[i]; else cout<<fst[i]<<" "; } } if(cas) { for(int i=0;i<bis;i++) cout<<ans[i]<<" "; } else { for(int i=0;i<bis;i++) { if(i==bis-1) cout<<ans[i]; else cout<<ans[i]<<" "; } } for(int i=cas-1;i>=0;i--) { if(!i) cout<<last[i]; else cout<<last[i]<<" "; } cout<<endl; return 0; }