Description
二哥把所有女朋友候选人列了出来,一共有N组,编号为0~N-1。最开始的时候每组只有1个女生,每个女生有一个魅力值。二哥不断进行以下三种操作:
将一组并入另一组
将一组中魅力值最小的拿走
给某一组中添加一个女生
值得注意的是,如果X组在操作0中被并入其他组,那么二哥将不会再对X组进行这三种操作。
Input Format
第一行:N M(0≤N,M≤300,000 )分别表示最开始的组数与总的操作的次数
接下来N行每行一个整数,表示最初0~N-1组中那个女生的魅力值接下来M行
每行首先是一个整数,表示操作编号,0表示合并,1表示拿走魅力值最小的,2表示添加
对于操作0,跟着两个整数,a b,表示将编号为b的组并入编号为a的组(编号为b的组从此消失了)对于操作1,跟着一个整数,a,表示讲编号为a的组中魅力值最小的女生拿走
对于操作2,跟着两个整数,a b,表示在编号为a的组中添加一个魅力值为b的女生
Output Format
对于每个操作1,输出一行,包含一个整数,表示被拿走的女生的魅力值(如果二哥妄图从一组已经没有人的组内拿走女生,请输出-1)Sample ##Input
5 9
0
36
49
98
3
1 4
0 2 4
1 1
0 0 3
1 0
0 1 2
0 0 1
2 0 15
1 0
Sample Output
3
36
0
15
代码
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int N,M;//最开始的组数和总操作次数
cin>>N>>M;
priority_queue <int,vector<int>,greater<int>> *Group = new priority_queue <int,vector<int>,greater<int>> [N];
for(int i=0;i<N;i++)
{
int priority;
cin>>priority; //魅力值
Group[i].push(priority);
}
for(int i=0;i<M;i++)
{
int opt;
cin>>opt;
if(opt==1) //一个操作数
{
int OptNum;
cin>>OptNum;
if(!Group[OptNum].empty() )
{
int pop = Group[OptNum].top();
Group[OptNum].pop();
cout<<pop<<endl;
}
else cout<<"-1"<<endl;
}
else if(opt==0)
{ //两个操作数
int OptNum1;
int OptNum2;
cin>>OptNum1;
cin>>OptNum2;
while(!Group[OptNum2].empty())
{
int temp= Group[OptNum2].top();
Group[OptNum2].pop();
Group[OptNum1].push(temp);
}
}
else{
int OptNum1;
int OptNum2;
cin>>OptNum1;
cin>>OptNum2;
Group[OptNum1].push(OptNum2);
}
}
delete [] Group;
return 0;
}
备注:这题有一例不通过,只能得90