问题描述
众所周知,懒羊羊是所有小羊里最贪吃的一只。然而,鲜为人知的是,懒羊羊也有存储粮食的习惯。而更让大家吃惊的事实是,我们的懒羊羊做事很有条理,每当他存储一份粮食时,他会专门拿出一个筐来存放。因此,他的仓库里有很多很多筐的青草。而我们的懒羊羊又是一个经常馋嘴的小羊,每当他想吃草时,就会从仓库里找出数量最少的一筐草,把它吃掉。可是懒羊羊因为草吃得太多了导致大脑运转缓慢,所以他不得不向你请求支援,帮他找出他应该吃数量为多少的青草。
输入格式
第一行为一个正整数n,表示懒羊羊一共进行了n次操作(2<=n<=1000000) 第二行至第n+1行每行表示一个懒羊羊的操作,当这行形式为 单独一个字符'q' 时,表示懒羊羊肚子饿了,要吃掉仓库里当前数量最少的那份青草;当这行形式为一个字符'i' 和一个整数k时,表示懒羊羊将一份数量为k(1<=k<=maxlongint=2147483647,maxlongint是pascal语言中最大的长整型数,长整型数即longint)的青草存入了仓库,'i'和k之间用空格隔开。 输入数据保证每次询问时仓库里都有草可吃且所有操作中懒羊羊至少会吃一次草。
输出格式
每当输入为'q' 时, 输出懒羊羊当前吃掉的那份青草的数量是多少。
输入输出样例
样例1
输入样例
5
i 5
i 2
q
i 9
q
输出样例
2
5
数据范围与提示
【数据规模】 30%数据满足1<=p<=3000; 60%数据满足1<=p<=40000; 100%数据满足1<=p<=1000000。
【样例解释】 共有5次操作,分别为懒羊羊存入数量为5的青草,存入数量为2的青草,吃掉当前数量最少的青草(2),存入数量为9的青草,吃掉当前数量最少的青草(5)。
#include<bits/stdc++.h>
using namespace std;
int n,heap[10010],sz;
long long k;
char c;
void push(int x) {
int i=sz++;
while(i>0) {
int p=(i-1)/2;
if(heap[p]<=x) break;
heap[i]=heap[p];
i=p;
}
heap[i]=x;
}
int pop() {
int ret=heap[0];
int x=heap[--sz];
heap[sz]=0;
int i=0;
while(i*2+1<sz) {
int a=i*2+1,b=i*2+2;
if(b<sz&&heap[b]<heap[a]) a=b;
if(heap[a]>=x) break;
heap[i]=heap[a];
i=a;
}
heap[i]=x;
return ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) {
cin>>c;
if(c=='i') {
scanf("%lld",&k);
push(k);
}
if(c=='q') {
printf("%lld\n",pop());
}
}
return 0;
}
40分T!
摆烂了半个下午了