sjtu1216
Description
使用最小化堆實現一個整型的優先隊列,實現下列功能:
insert x,將優先級值為x的元素入隊
find x,找出優先級值大於x的最小的元素,輸出其下標。如果有多個元素優先級值相同輸出下標最小的那個。
DECREASE i v,將第i個節點的優先級值減少v。
Input Format
第一行含有一個正整數M(1<=M<=20000),代表總的操作數。
以下M行,每行一個操作。
Output Format
對於每個find操作,輸出一個下標。回車分隔。
Sample Input1
9
insert 5
insert 6
insert 7
find 5
find 6
decrease 1 3
decrease 2 5
decrease 3 5
find 1
Sample Output1
2
3
2
Limit
輸入數據保證合法
find操作只要求時間復雜度O(n),其他操作要求O(logn)
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<climits>
#define maxn 20050
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x)
{
x=0;
T f=1;
char c=getchar();
for(; c<'0'||c>'9'; c=getchar()) if(c=='-') f=-1;
for(; c>='0'&&c<='9'; c=getchar()) x=(x<<1)+(x<<3)+(c&15);
}
template<typename T>inline void print(T x)
{
if(x<0) putchar('-'),x*=-1;
if(x>=10) print(x/10);
putchar(x%10+'0');
}
struct Heap //用最小堆實現優先隊列
{
int size,queue[maxn];
Heap()
{
size=0;
for(int i=0;i<maxn;i++)
queue[i]=0;
}
void shift_up(int i) //上放
{
while(i>1)
{
if(queue[i]<queue[i>>1])
{
int temp=queue[i];
queue[i]=queue[i>>1];
queue[i>>1]=temp;
}
i>>=1;
}
}
void shift_down(int i) //下方
{
while((i<<1)<=size)
{
int next=i<<1;
if(next<size && queue[next+1]<queue[next])
next++;
if(queue[i]>queue[next])
{
int temp=queue[i];
queue[i]=queue[next];
queue[next]=temp;
i=next;
}
else return ;
}
}
void push(int x)
{
queue[++size]=x;
shift_up(size);
}
void pop() //出隊是將首元素與末尾元素交換,再下放
{
int temp=queue[1];
queue[1]=queue[size];
queue[size]=temp;
size--;
shift_down(1);
}
int top(){return queue[1];} //取首元素
bool empty(){return size;} //判空
int Find(int a)
{
int minn=INT_MAX,mini=INT_MAX; //注意初始的時候不要太小, 頭文件<climits>
for(int i=0;i<=size;i++) //開始初始為99999,結果wa
{
if(queue[i]>a)
{
if(minn>queue[i])
{
minn=queue[i];
mini=i;
}
}
}
return mini;
}
void decrease(int a,int b)
{
queue[a]-=b;
shift_up(a);
}
};
int main()
{
// std::ios::sync_with_stdio(false);
// std::cin.tie(0);
Heap Q;
int m,a,b;
string s;
read(m);
while(m--)
{
cin>>s;
//cout<<s<<endl;
if(s=="insert")
{
read(a);
Q.push(a);
}
else if(s=="find")
{
read(a);
print(Q.Find(a));
puts("");
}
else
{
read(a);
read(b);
Q.decrease(a,b);
}
}
return 0;
}
