练习赛qu(大根堆 STL)

来源:互联网 发布:淘宝打印画骗局 编辑:程序博客网 时间:2024/05/22 11:57

qu

【问题描述】
给你一个操作序列 ,问这个维护操作序列的数据结构是哪一种 ?
【输入格式】
第一行是一个正整数n代表操作数目 。
接下来n行,每行两个正整数opt,v。如果opt=1,代表我们将v加入数据结构;如果 opt=2,代表我们从数据结构中取出了一个元素,这个元素的值是 ��。
【输出格式】
输出 三行, 第一行代表数据结构是否可能栈 ,第二行代表数据结构是否可 能是队列 ,第三行代表数据结构是否可能大根堆。每一行的结果都只可能是“ 。每一行的结果都只可能是“ YES” 或者 “No”。
【样例输入】
2
1
2 1
【样例输出】
YES
YES
YES
【数据规模与约定】
100%的数据满足 1≤n≤10^3。

思路:
直接模拟相应数据结构,判断弹出元素是否和给定数字一致。注意可能会出现不合法的输入,需要特判弹出操作比插入操作多的情况。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<queue>#define N 1005#define del(a,b) memset(a,b,sizeof(a))using namespace std;queue<int>q;priority_queue<int>q1;int n,ok1=1,ok2=1,ok3=1,opt,x;int stack[N],top;int main(){    freopen("qu.in","r",stdin);    freopen("qu.out","w",stdout);    scanf("%d",&n);    for(int i=1;i<=n;i++){        scanf("%d%d",&opt,&x);        if(opt==1){            if(ok1)                stack[top++]=x;            if(ok2)                q.push(x);            if(ok3)                q1.push(x);        }        if(opt==2){            if(ok1){                if(top==0||stack[top-1]!=x)ok1=0;                else top--;            }            if(ok2){                if(q.empty()||q.front()!=x)ok2=0;                else q.pop();            }            if(ok3){                if(q1.empty()||q1.top()!=x)ok3=0;                else q1.pop();            }        }    }    if(ok1)printf("YES\n");else printf("No\n");    if(ok2)printf("YES\n");else printf("No\n");    if(ok3)printf("YES\n");else printf("No\n");    return 0;}