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

题目链接:

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;

}




 


 

你可能感兴趣的:(数据结构)