首页 > 其他分享 >【模板】可并堆 之 左偏树

【模板】可并堆 之 左偏树

时间:2024-11-21 22:46:26浏览次数:1  
标签:dist rs int tr fa ls 模板 左偏

**P3377【模版】左偏树/可并堆**

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;

int n, m;
struct Heap {
	int ls, rs;
	int dist, val, fa;
} tr[N];

int fifa(int x) {
	return tr[x].fa == x ? x : tr[x].fa = fifa(tr[x].fa);
}

int merge(int x, int y) 
{
	if (!x || !y)
		return (x + y);
		
	if (tr[x].val > tr[y].val)
		swap(x, y);
		
	tr[x].rs = merge(tr[x].rs, y);
	
	if (tr[tr[x].ls].dist < tr[tr[x].rs].dist)
		swap(tr[x].ls, tr[x].rs);
		
	tr[x].dist = tr[tr[x].rs].dist + 1;
	
	tr[tr[x].ls].fa = tr[tr[x].rs].fa = tr[x].fa = x;//
	
	return x;
}

void pop(int x) 
{
	printf("%d\n", tr[x].val);
	
	tr[x].val = -1;
	
	tr[tr[x].ls].fa = tr[x].ls;
	tr[tr[x].rs].fa = tr[x].rs;
	tr[x].fa = merge(tr[x].ls, tr[x].rs);//
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &tr[i].val);
		tr[i].fa = i;
	}
	int opt, x, y;
	for (int i = 1; i <= m; i++) {
		scanf("%d%d", &opt, &x);
		switch (opt) {
			case 1: {
				scanf("%d", &y);
				if (tr[x].val == -1 || tr[y].val == -1) 
					continue;
				int fax = fifa(tr[x].fa);
				int fay = fifa(tr[y].fa);
				if (fax == fay) continue;
				merge(fax, fay);
				break;
			}
			case 2: {
				if (tr[x].val == -1) printf("-1\n");
				else {
					int faa = fifa(tr[x].fa);
					pop(faa);
					break;
				}
			}
		}
	}
	return 0;
}

标签:dist,rs,int,tr,fa,ls,模板,左偏
From: https://www.cnblogs.com/UeesugiSakura/p/18561735

相关文章

  • 【模板】朱刘算法
    【模板】朱刘算法#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+2;introot,n,m;structEdge{ intu,v,w;}e[N];intid[N],vis[N],pre[N],incost[N];voidzhuliu(){ inttn=0; intres=0; while(1) { tn=0; for(inti=1;i<=n;i++){......
  • 模板
    数据结构线段树2voidbuild(intp,intl,intr){ l(p)=l,r(p)=r; if(l==r)return; intmid=l+r>>1; build(ls(p)=p<<1,l,mid),build(rs(p)=p<<1|1,mid+1,r);}voidpushdown(intp){ sum(ls(p))=(sum(ls(p))*mul(p)+add(p......
  • vxe-grid 自定义插槽模板
    在vxe-table中使用vxe-grid渲染表格,当配置式不能满足需求时,。需要使用自定义插槽模板来自定义业务需求,实现更灵活的功能。vxe-grid支持多种自定义方式,可以使用插槽模板,也可以使用插槽来自定义模板。自定义单元格模板<template><div><vxe-gridv-bind="gridOptions......
  • 【wx小程序开发】模板调用 data 里的函数
    微信小程序glass-easel组件框架新增特性中支持在模板中调用data里的函数。如果data中的某个字段是函数,在模板里可以直接调用它:Component({data:{getDataField(){return'someValue'},},})<view>{{getDataField()}}</view>尽管这样做有时会......
  • 贵阳业财模板
    一、jenkins流水线模板:pipeline{agentanyenvironment{CLEANED_BRANCH="${params.BRANCH}".replace("/","-")BUILD_TAG="${CLEANED_BRANCH}-${newDate().format('yyyyMMddHHmmssSSS')}-${env.BUILD_......
  • 实验4 类的组合、继承、模板类、标准库
    task2:代码:1#include<iostream>2#include<vector>3#include<string>4#include<algorithm>5#include<numeric>6#include<iomanip>78usingstd::vector;9usingstd::string;10usingstd::c......
  • 【模板】状压DP
    **[POI2004]PRZ****考察内容:二进制子集遍历,DP转移**#include<bits/stdc++.h>usingnamespacestd;intn,W;structdata1{ intt,w;}a[20];intdp[(1<<20)],tt[(1<<20)],ww[(1<<20)];intmain(){ scanf("%d%d",&W,&n); for(......
  • 实验4 类的组合、继承、模板类、标准库
    实验2GradeCalc.hpp#include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingstd::vector;usingstd::string;usingstd::cin;usingstd::cout;usingstd::en......
  • 实验4 类的组合、继承、模板类、标准库
    实验任务1task1_1.cpp#include<iostream>usingstd::cout;usingstd::endl;//类A的定义classA{public:A(intx0,inty0);voiddisplay()const;private:intx,y;};A::A(intx0,inty0):x{x0},y{y0}{}voidA::display()const{......
  • 模板代码设计工具
    项目地址:https://github.com/hkmadao/re_tcdt_rust.git目前流行低代码,无代码的开源项目,一定程度上可以帮组开发者减轻开发工作量,生成一些固定页面的功能,但是有较强的自定义需求时,使用起来还是有一定困难:只能按照低代码项目的框架去实现我们的目标项目代码模板比较固定,即使允许......