当前位置: 首页 > news >正文

2026/8/8

8/8

priority_queue<int> q;
priority_queue<int,vector<int>,greater<int> > p;

上面是大根堆,下面是小根堆
可用操作:push,pop,top,size,empty

对顶堆

常用于维护动态第k大问题(平衡树也可以做到也说不了啥)

一个小根堆,一个大根堆,小根堆维护大于等于k的所有值,这样的话第k大就在堆顶,大根堆维护小于k的所有值,然后有一个维护操作,如果小根堆小于k,反复把大根堆堆顶加入小根堆,如果大于k,反复把小根堆堆顶推到大根堆,然后剩下的操作例如删除,添加之类的直接操作后进行维护就行了。

维护中位数的problem

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define debug(...) fprintf(stderr,##__VA_ARGS__)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rrep(i,a,b) for(int i=b;i>=a;i--)
#define pii pair<int,int>
#define pll pair<ll,ll>
#define vi vector<int>
#define vp vector<pii>
#define inf 0x3f3f3f3f
#define fread freopen("input.txt","r",stdin)
#define fwrite freopen("output.txt","w",stdout)
#define readi read<int>()
#define readl read<ll>()
#define bs bitset<1010>
using namespace std;
typedef long long ll;
template<typename T>
inline T read(){T x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
template<typename T>
inline void print(T x){if(x<0){putchar('-');x=-x;}if(x>9)print(x/10);putchar(x%10+'0');
}
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int> > p;
int TT;
void check(){while(q.size()<p.size()){int tmp=p.top();q.push(tmp);p.pop();}while(p.size()+1<q.size()){int tmp=q.top();q.pop();p.push(tmp);}return ;
}
int main() {TT=readi;while(TT--){int op=readi;while(!q.empty()) q.pop();while(!p.empty()) p.pop();while(op!=0){if(op>0){if(q.empty() || op<=q.top()){q.push(op);}else{p.push(op);}check();}else if(op==-1){cout<<q.top()<<"\n";q.pop();check();}else{break;}op=readi;}// cout<<"大根堆:"<<"\n";// for(int v:q) cout<<v<<" ";// cout<<endl;// cout<<"小根堆"<<"\n";// for(int v:p) cout<<v<<' ';}debug("Time: %.3lf\n", double(clock()) / CLOCKS_PER_SEC);return 0;
}

这个代码是用大根堆为存储中位数的方法去做的,代码就是上面的,注意多测清空以及到底是用大于小于号

可并堆

配对堆

就是改变一下堆的结构,但改变后也是树
同一深度的val是兄弟节点,父亲节点连接最左端的兄弟节点,兄弟节点之间建边,其余子树也同理。
这样的结构可以暴力的去合并以及插入,两个堆里取较小点作为根节点,可以用指针做。
那么删除操作就要复杂一点,我们考虑第一遍的每两个先合并为较大的,然后线性的去合并,可以证明复杂度均摊O(log n)
然后是减小一个值,如果是根节点对于小根堆来说减少是不劣的,如果是儿子节点的话,直接拆开然后重新合并即可。

实现没有写,可以image

http://www.jsqmd.com/news/1354879/

相关文章:

  • 抖掌柜|无货源抖音小店运营全攻略,一键铺货选品AI违规检测多店管理,新手店群精细化起店实操指南 - 抖掌柜—键铺货
  • 如何在5分钟内上手Laravel Prompts?从安装到第一个交互式命令行表单
  • 2026年土地专业推荐:王兴华律师与京云律所征地维权实务解析 - 优企甄选
  • 抖掌柜|抖音小店选品一键铺货教学 AI违规检测多店互搬矩阵运营完整避坑指南 - 抖掌柜—键铺货
  • Buzz:构建完全离线的本地语音转文字工作站
  • J2EEScan性能优化:提升J2EE应用扫描效率的5个实用技巧
  • 如何高效备考408考研:5个技巧帮你掌握计算机专业课程复习
  • 实战指南:从零构建企业级蜜罐防御系统 - Ehoney完整教程
  • 10 万 Star 的 Codex CLI 到底在做什么?Agent 工作流拆解
  • Spoke:无需3D建模经验!快速创建自定义3D环境的终极指南
  • 韶关粤菜餐厅选哪家更适合家庭聚餐?我在福宴食府吃出了本地老店的实在感 - 优企甄选
  • 抖掌柜|抖音小店多店互搬一键铺货实操 AI选品+违规检测无货源店群完整玩法教程 - 抖掌柜—键铺货
  • 如何在10分钟内免费玩转视觉小说翻译神器LunaTranslator
  • 肇庆粤菜餐厅怎么选更划算?我对比了几家,李福记酒家的食材新鲜度真的超出预期 - 优企甄选
  • 十二、错误 和 异常
  • SEIRS+常见问题解答:新手必知的15个关键知识点
  • 文档处理技能架构:从技术挑战到工程化解决方案
  • 解决90%的常见问题:Blender VS Code故障排除与日志分析指南
  • 如何优雅地解决微信公众号订阅难题:wewe-rss完整指南
  • mlx-lm实战:用Python轻松调用XORTRON.CriminalComputing.LARGE.2026.3-mlx-6Bit生成高质量文本
  • Flipper Zero无线安全分析实战指南:从车库门到智能家居的全面防护策略
  • 【Bug已解决】`transformers.image_transforms.resize` doesnot work for negative values 解决方案
  • 抖掌柜实操|从零做抖音无货源小店,一键铺货、多店互搬、AI违规检测全套玩法深度拆解 - 抖掌柜—键铺货
  • Laravel Prompts核心功能全解析:10种表单组件让你的CLI应用脱颖而出
  • 社交媒体自动化上传终极指南:一键分发内容到8大平台
  • 如何在WebGL项目中高效集成Live2D动态角色:Pixi-Live2D实战指南
  • ComfyUI-Frame-Interpolation:12种算法一站式解决视频帧插值难题
  • ZotMoov终极指南:5步实现Zotero文献附件自动化管理
  • GitHub ReadME Terminal核心功能详解:从安装到自定义的完整教程
  • 基于FPGA的图像形态学膨胀处理Verilog开发与开发板硬件测试