• 取球游戏(C++)[堆]


    题目:

    Description

    小J有很多空白的球和一个袋子。最初,袋子是空的。

    小J将会作出Q个操作,具体如下:

    操作1 在白球上写一个数字X_i然后扔进袋子里;

    操作2 将袋子里所有球的数字都加上X_i

    操作3 输出袋子里最小的数字并把它从袋子里取出。

    Q<=2*100000

    x_i<=1e9

    Format

    Input

    见样例

    Output

    针对每个操作3,输出结果

    Samples

    输入数据 1

    1. 5
    2. 1 3
    3. 1 5
    4. 3
    5. 2 2
    6. 3

    输出数据 1

    1. 3
    2. 7

    思路:

    从”操作1“和 “操作3”不难看出,这道题要用来储存元素

    但是第二个操作就有些棘手了

    思路1:如果我们用每次将堆里存的元素取出来,再统一加上一个数,在全部装进堆里:

    假设有堆里n个元素

    每次操作的时间复杂度大概是O(2*n*log2(n))

    (注:堆的删除与插入的时间复杂度都是O(log2(n))的)

    结合数据范围Q<=2*100000,这种方法是绝对过不了的

     当时我们队里的人都懵B了,以为教练出错题了

    思路2:这时我们的教练告诉了我们一个时间复杂度O(1)的操作:

    在上一个算法的基础上我们可以开一个懒标记lazy

    针对每个“操作2”,我们可以在lazy加一个x_i

    等到执行“操作3”时,再在弹出的堆顶加上一个lazy就行了

    可是这样做连后面进来的元素也会被打上标记

    这时我们可以这样做:
    针对每个“操作1”:将每个读入的x_i,先减去一个lazy,再打入堆中,这样就可以将前面的标记抵消掉。

    Code:

    1. #include
    2. using namespace std;
    3. //小根堆,每次弹出堆中最小值
    4. priority_queue<long long, vector<long long>, greater<long long> >a;
    5. //操作
    6. int operate;
    7. //懒标记
    8. long long lazy = 0;
    9. long long num;
    10. long long ans = 0;
    11. int n;
    12. int main()
    13. {
    14. cin >> n;
    15. for (int i = 1; i <= n; i++)
    16. {
    17. scanf("%d", &operate);
    18. if (operate == 1)
    19. {
    20. scanf("%lld", &num);
    21. //插入 num-lazy 抵消前面的操作
    22. a.push(num - lazy);
    23. }
    24. if (operate == 2)
    25. {
    26. scanf("%lld", &num);
    27. //标记加上num
    28. lazy += num;
    29. }
    30. if (operate == 3)
    31. {
    32. //输出别忘了加上标记
    33. printf("%lld\n", a.top() + lazy);
    34. a.pop();
    35. }
    36. }
    37. return 0;
    38. }

  • 相关阅读:
    x64内核实验7-线程
    安卓APP源码和设计报告——智能垃圾桶
    代码随想录算法训练营第十九天 | LeetCode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树
    Photoshop与Web技术完美融合,Web版Photoshop已正式登场
    SpringCloudAlibaba全网最全讲解5️⃣之Feign(建议收藏)
    Python小知识点汇集——1
    dumpbin工具的使用
    uniapp分享位置到微信
    java8 List的Stream流操作 (实用篇 三)
    PyTorch
  • 原文地址:https://blog.csdn.net/ytk888/article/details/126293301