好吧,说实话从学 \(OI\) 到现在一棵堆也没有手写过……
然而似乎也从来没有被卡过常,\(STL\) 开 \(O2\) 还是挺快的
首先记录一下怎么也写不对的小根堆:
priority_queue<int,vector<int>,greater<int> >q;
注意两个右括号间加空格要不会 \(CE\)(貌似现在 \(14\) 下也不会了)
- 可删堆
朴素的堆是不能支持删除的,可以开一个“垃圾堆”来把删除的元素放进去,询问的时候同时弹掉直到堆顶不相同
这样写出来一般会 \(set\) 会快
对顶堆
对顶堆用于维护动态第 \(k\) 大,支持删除第 \(k\) 大,加入一个数
那么可以维护两个堆,小根堆中的元素都是大的,大根堆中的元素都是小的,只要保证大根堆的大小始终为 \(k\),那么直接回答询问就好了。小根堆用于调和,维持大根堆中的数目
注意一定要先加后删
标签:,大根堆,弹掉,删除,询问,元素,小根堆 来源: https://www.cnblogs.com/yang-cx/p/15554512.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。