数据结构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; }