数据结构multiset hdu-2275-Kiki & Little Kiki 1

来源:互联网 发布:linux chgrp 单词 编辑:程序博客网 时间:2024/04/27 00:28

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2275

题目意思:

有两种操作:

1、push a 把a放进数组里。

2、pop a 输出不超过a的最大的数,并去掉。

解题思路:

用multiset可以过。

对于操作二先判断容器里面有没有该数,有的话直接输出。没有的话,把a放进容器里,然后查a的位置,-- 得到上一个的位置,最后删除两个迭代器。

代码:

#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#define eps 1e-6#define INF 0x1f1f1f1f#define PI acos(-1.0)#define ll __int64#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;/*freopen("data.in","r",stdin);freopen("data.out","w",stdout);*/char ki[10];multiset<int>mys;int main(){   int n,d;   multiset<int>::iterator it1,it;   while(scanf("%d",&n)!=EOF)   {      mys.clear();      for(int i=1;i<=n;i++)      {         scanf("%s%d",ki,&d);         if(ki[1]=='u')            mys.insert(d);         else         {            if(mys.empty()||d<*mys.begin())            {               printf("No Element!\n");               continue;            }            it=mys.find(d);            if(it!=mys.end()) //如果本来就有,直接输出删除            {               printf("%d\n",d);               mys.erase(it);               continue;            }            mys.insert(d); //构造 先放一个d进去 再找到d所在的位置,然后--得到上一个位置,注意没有相同的d在容器里面            it=it1=mys.find(d);            printf("%d\n",*(--it));            mys.erase(it); //删除构造的和找到的            mys.erase(it1);         }      }      puts("");   }   return 0;}