堆——模拟

发布时间:2024年01月22日

在本题中,你需要实现一个数据结构,它需要支持以下操作:
1. 插入:给定整数 x ,将数 x 插入该数据结构中。
2. 删除:将该数据结构的其中一个最小值从该数据结构中删除。
3. 加法:给定整数 x ,将该数据结构中的所有元素全部加上 x 。
对于每个操作 2 ,你需要输出被删除的值。

输入
第一行包含一个正整数 Q (2 ≤ Q ≤ 1e6) , 表示操作的次数。
接下来?
Q 行,每行将以下方的格式来描述每次操作:
- 1 x:表示题目描述中的操作 1 。
- 2:表示题目描述中的操作 2 。
- 3 x:表示题目描述中的操作 3 。
对于操作 1 和操作 3 的 x 满足 ∣x∣ ≤ 1e9 。保证每次操作 2 时该数据结构内至少有一个元素。

输出
输出包含若干行,每行有一个整数。
第 i 行的整数表示第 i 次操作 2 所删除的数的大小。

Input
13
1 1
1 1
1 2
1 3
1 4
2
3 10
2
1 1
2
1 12
2
2

Output
1
11
1
12
12

解析:
不难看出,不考虑操作 3,就是模拟一个小根堆。
对于操作 3,可以发现在集体加上某个值之后,相对位置不发生改变。
所以我们可以设置一个变量 cnt,
对于操作3 ,cnt加上x;
对于操作1 ,将x减去cnt,加入堆;
对于操作2 ,将堆顶元素加上cnt,弹出。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
priority_queue <int,vector<int>,greater<int>> q;
int cnt=0;
void solve()
{   
    int op;
    cin>>op;
    if (op==1)
    {
        int x;
        cin>>x;
        q.push(x-cnt);
    }
    else if (op==2)
    {
        cout<<q.top()+cnt<<endl;
        q.pop();
    }
    else 
    {
        int x;
        cin>>x;
        cnt +=x;
    }
}
signed main()
{
    ios;
    int T=1;
    cin>>T;
    while (T--) solve(); 
    return 0;
}

文章来源:https://blog.csdn.net/m0_74403543/article/details/135740621
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。