Description:

一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:

操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除第x和第y个数在用一个堆内,则无视此操作)

操作2: 2 x 输出第x个数所在的堆最小数,并将其删除(若第x个数已经被删除,则输出-1并无视删除操作)

Hint:

对于100%的数据:N<=100000,M<=100000

Solution:

模板题,详见代码

#include<bits/stdc++.h>
using namespace std;
const int mxn=1e5+5;
int n,m;
int ch[mxn][2],vis[mxn],val[mxn],dis[mxn]={-1},fa[mxn],f[mxn]; //勿忘记初始化dis[0]=-1 int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
} int merge(int x,int y)
{
if(!(x&&y)) return x+y;
if(val[x]>val[y]||(val[x]==val[y]&&x>y))
swap(x,y);
ch[x][1]=merge(ch[x][1],y); fa[ch[x][1]]=x;
if(dis[ch[x][0]]<dis[ch[x][1]])
swap(ch[x][0],ch[x][1]);
dis[x]=dis[ch[x][1]]+1;
return x;
} void del(int x)
{
vis[x]=1;
fa[ch[x][0]]=ch[x][0],fa[ch[x][1]]=ch[x][1];
fa[x]=merge(ch[x][0],ch[x][1]); //这里有个细节,由于路径压缩的存在,原树中的点可能指向删除节点,故需更新删除节点的fa[]
} int main()
{
scanf("%d%d",&n,&m); int opt,x,y;
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1;i<=n;++i) scanf("%d",&val[i]);
for(int i=1;i<=m;++i) {
scanf("%d",&opt);
if(opt==1) {
scanf("%d%d",&x,&y);
if(vis[x]||vis[y]) continue ; //切记判断两点存在
x=find(x),y=find(y);
if(x!=y) //判断是否在一个堆
merge(x,y);
}
else {
scanf("%d",&x);
printf("%d\n",vis[x]==0?val[x=find(x)]:-1); //判断是否存在
if(!vis[x]) del(x);
}
} return 0;
}

最新文章

  1. asp.net MVC 源码分析
  2. Beaglebone Black&ndash; 智能家居控制系统 LAS - 网页服务器 Node.js 、Web Service、页面 和 TCP 请求转 UDP 发送
  3. SVM实用操作: svmtrain and svmclassify
  4. 设置xx-net,访问youtube等国外网站
  5. JAX-RS入门 二 :运行
  6. JS实现rgb与16进制颜色相互转换
  7. InnoDB 数据表压缩原理与限制
  8. 实例化讲解 RunLoop
  9. Seajs教程
  10. Submin1安装记录(CentOS5)
  11. Jetty 开发指南: 嵌入式开发之HelloWorld
  12. MyBatis(九) 使用association定义单个对象的封装规则
  13. Kali 2.0 Web后门工具----WebaCoo、weevely、PHP Meterpreter
  14. 微信小程序基础
  15. c语言学习5
  16. Autonomous driving - Car detection YOLO
  17. 黄聪:移动应用抓包调试利器Charles
  18. Android 开发服务类 05_ ApkPatchDemo
  19. jquery miniui 学习笔记
  20. Linux C 重定向简单范例

热门文章

  1. 通过全备+relaylog同步恢复被drop的库或表
  2. C/C++:.hpp与.h区别
  3. 读SRE Google运维解密有感(三)
  4. 关于windows2008r2系统80端口被system进程占用的问题
  5. 【Android开发】之Fragment与Acitvity通信
  6. 深入理解AsyncTask的工作原理
  7. ipython+notebook使用教程(转载)
  8. 移位操作符 &lt;&lt; &gt;&gt; &gt;&gt;&gt;
  9. Math 对象
  10. 步步为营-53-JavaScript