【问题描述】 给你一个操作序列,问这个维护操作序列的数据结构是哪一种?
【输入格式】 第一行是一个正整数?代表操作数目。 接下来?行,每行两个正整数???, ?。如果??? = 1,代表我们将?加入数据结构;如果??? = 2,代表我们从数据结构中取出了一个元素,这个元素的值是?。
【输出格式】 输出三行,第一行代表数据结构是否可能是栈,第二行代表数据结构是否可 能是队列,第三行代表数据结构是否可能大根堆。每一行的结果都只可能是“YES” 或者“No”。
根据题意,建立三种数据结构:队列、优先队列(本质是大根堆)和栈,然后模拟即可。
坑点有两个。
一个是,当数据全部弹出后,还有弹出操作,那一定不满足任意数据结构,三个都是No
第二个,题目的YES是全部大写的,但是No的o是小写的。
附上代码
#include#include using namespace std;template inline void read(T &_a){ bool f=0;int _ch=getchar();_a=0; while(_ch<'0' || _ch>'9'){ if(_ch=='-')f=1;_ch=getchar();} while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();} if(f)_a=-_a;}int n,opt,v,stack[10001],head;bool ansq=true,anspq=true,ansstk=true;queue q;priority_queue pq;int main(){ freopen("qu.in","r",stdin); freopen("qu.out","w",stdout); read(n); for (register int i=1;i<=n;++i) { read(opt); read(v); if(opt==1) { if(ansq) q.push(v); if(ansstk) stack[++head]=v; if(anspq) pq.push(v); } else { if(ansstk) { if(head&&stack[head]==v) --head; else ansstk=false; } if(ansq) { if(!q.empty()&&q.front()==v) q.pop(); else ansq=false; } if(anspq) { if(!pq.empty()&&pq.top()==v) pq.pop(); else anspq=false; } } } printf("%s\n%s\n%s",ansstk?"YES":"No",ansq?"YES":"No",anspq?"YES":"No"); return 0;}