首页 > 其他分享 >kedaOJ#P0776. 【模板】可并堆

kedaOJ#P0776. 【模板】可并堆

时间:2024-07-14 14:51:28浏览次数:15  
标签:kedaOJ Node right P0776 val int px find 模板

思路

可并堆不会的看作者的 https://www.cnblogs.com/mcr130102/p/18301571

代码

复制都运行不了好吧

 #include <iostream>
 #include <vector>
 #include <queue>//堆用队列实现
 #include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
int parent[MAXN];
int find(int x) {
	if (parent[x] != x) parent[x] = find(parent[x]);
	return parent[x];
}   
void unionSet(int x, int y) {
	int px = find(x), py = find(y);
	if (px != py) parent[px] = py;
}
struct Node    {//使用结构体构建堆
	int val, dist, id;
	Node *left, *right;   
	Node(int v, int i) : val(v), dist(0), id(i), left(nullptr), right(nullptr) {}
};
Node* merge(Node* a, Node* b) {//合并堆
	if (!a) return b;
	if (!b) return a;
	if (a->val > b->val || (a->val == b->val && a->id > b->id)) swap(a, b);
	a->right = merge(a->right, b);
	if (!a->left || a->left->dist < a->right->dist) swap(a->left, a->right);
	a->dist = a->right ? a->right->dist + 1 : 0;
	return a;
}   
Node* pop(Node* a) {//将节点弹出堆
	Node* ret = merge(a->left, a->right);
	delete a;
	return ret;
}
Node* heap[MAXN];
bool deleted[MAXN];
int main() {
	int n, m;
	cin >> n >> m;
	vector<int> values(n + 1);
	for (int i = 1; i <= n; ++i) {
		cin >> values[i];
		parent[i] = i;
		heap[i] = new Node(values[i], i);
	}
	while (m--) {
		int op, x, y;
		cin >> op;
		if (op == 1) {
			cin >> x >> y;
			if (deleted[x] || deleted[y] || find(x) == find(y)) continue;
			int px = find(x), py = find(y);
			unionSet(px, py);
			heap[py] = merge(heap[px], heap[py]);
		} else if (op == 2) {
			cin >> x;
			if (deleted[x]) {
				cout << -1 << endl;
				continue;
			}
			int px = find(x);
			cout << heap[px]->val << endl;
			deleted[heap[px]->id] = true;
			heap[px] = pop(heap[px]);
		}
	}
	return 0;
}

标签:kedaOJ,Node,right,P0776,val,int,px,find,模板
From: https://www.cnblogs.com/mcr130102/p/18301582

相关文章

  • 帝国CMS网站内容模板变量说明
    (一)、字段值数组:$navinfor调用方法:$navinfor['字段名'],比如要显示"信息ID字段",那在模板里用:<?=$navinfor['id']?>即可输出(单引号加不加均可)(二)、使用范例1:调用与当前信息的标题相同的下载信息。灵动标签调用:[e:loop={'download',10,18,0,"title='$navinfor[title]'"}]<a......
  • 易优CMS模板标签pagelist列表分页只显示首页、上下页、末页
    [基础用法]标签:pagelist描述:调用列表分页页码(注:需要在list标签下使用。)用法:{eyou:listpagesize='10'titlelen='30'infolen='160'}<ahref='{$field.arcurl}'>{$field.title}</a>{/eyou:list}{eyou:pagelist listitem='index,pre......
  • 响应式UI知识付费系统源码 知识付费软件 教育下载网站模板 知识付费做的最好的平台 视
    内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍这是一款知识付费平台模板,后台可上传本地视频,批量上传视频连接,视频后台可设计权限观看,免费试看时间时长,会员等级观看,付费观看等功能,也带软件app权限下载,帮助知识教育和软件......
  • 【模板】字符串
    字符串哈希素数:13110612e6+931e7+192e7+933e7+231e9+97LL(1e16)+61Zfunctionn=strlen(s+1),m=strlen(t+1);z[1]=n;For(i,2,n,l=0,r=0){ if(i<=r)z[i]=min(z[i-l+1],r-i+1); while(s[z[i]+1]==s[i+z[i]])++z[i]; if(i+z[i]-1>......
  • 欧拉函数(模板)
    873.欧拉函数-AcWing题库874.筛法求欧拉函数-AcWing题库#include<bits/stdc++.h>usingnamespacestd;intget_erlers(intx){intres=x;for(inti=2;i<=x/i;i++){if(x%i==0){res=res/i*(i-1);while(x%i......
  • 约数问题(模板)
    869.试除法求约数-AcWing题库#include<bits/stdc++.h>usingnamespacestd;vector<int>solve(intx){vector<int>ans;for(inti=1;i<=x/i;i++){if(x%i==0){ans.push_back(i);if(x/i!=i)a......
  • ssycms模板文件结构
    模板文件结构资源目录结构├─tempalte模板文件夹  ├─default  模板名称  │├─css  CSS静态资源目录  │  ├─html  HTML模板目录  │  ├─images图片资源目录  │  ├─jsJavaScript资源目录  │  └─template.json模板配......
  • ssycms 详情模板页
    详情模板页以下列出常用详情模板页面调用标签代码你也可以将本篇内容复制到详情模板页中查看 template\default\html\article\articleDetail.html常用文章信息调用标签(仅在详情页面起作用)文章标题:{$itemInfo['title']}文章地址:{$itemInfo['url']}文章关键词:{$itemInfo['ke......
  • 后缀数组【jiangly模板】
    目录后缀数组简介后缀数组可以用于什么场景如何实现后缀数组倍增法求后缀数组\(height\)数组\(LCP\)(最长公共前缀)\(height\)代码模板参考文章后缀数组是一种非常强大的一种处理字符串问题的工具后缀数组简介前置知识:计数排序、基数排序后缀数组(SuffixArray)主要关系到两......
  • 易优Eyoucms网站assign功能:模板文件中定义变量,可在其他标签里使用该变量
    【基础用法】名称:assign功能:模板文件中定义变量,可在其他标签里使用该变量语法:{eyou:assignname='typeid'value='5'/}文件:无参数:name=''变量名value=''赋给变量名的值底层字段:无 【更多示例】-------------------------------示例1--------------------------------描述:在运......