[BZOJ3669][Noi2014]魔法森林 LCT

2023-12-07 06:58

本文主要是介绍[BZOJ3669][Noi2014]魔法森林 LCT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题有两个权值 我们把所有边按权值a排序 剩下的边都看成点放进一个LCT中 维护每一节点的最大权值点的位置 枚举所有的边 如果u, v连通 则删去最大的边 加入这条边

否则直接加入这条边 当发现1和n连通的时候更新答案

开数组的时候把val 和 MAX开成bool也是醉了orz

#include<cstdio>  
#include<algorithm>  
#include<cstring>  
#include<iostream>  
#include<queue>  
#define SF scanf  
#define PF printf  
using namespace std;  
typedef long long LL;
const int MAXN = 50000;
const int MAXM = 100000;
const int MAXNODE = 150000;
const int INF = 1234567890;
struct LCT {int ch[MAXNODE+10][2], fa[MAXNODE+10], MAX[MAXNODE+10];int val[MAXNODE+10], Q[MAXNODE+10];	bool rev[MAXNODE+10];bool isroot(int x) {return ch[fa[x]][0] != x && ch[fa[x]][1] != x;}void up(int x) {int ls = ch[x][0], rs = ch[x][1];MAX[x] = x;if(val[MAX[ls]] > val[MAX[x]]) MAX[x] = MAX[ls];if(val[MAX[rs]] > val[MAX[x]]) MAX[x] = MAX[rs];}void pushdown(int x) {int &ls = ch[x][0], &rs = ch[x][1];if(rev[x]) {rev[x] ^= 1; rev[ls] ^= 1; rev[rs] ^= 1;swap(ls, rs);}}void Rotate(int x) {int y = fa[x], z = fa[y];bool d = x == ch[y][0];if(!isroot(y)) ch[z][y == ch[z][1]] = x;fa[x] = z; fa[y] = x; fa[ch[x][d]] = y;ch[y][!d] = ch[x][d]; ch[x][d] = y;up(y);}void splay(int x) {int top = 0; Q[++top] = x;for(int i = x; !isroot(i); i = fa[i]) Q[++top] = fa[i];for(int i = top; i; i--) pushdown(Q[i]);while(!isroot(x)) {int y = fa[x];if(!isroot(y)) Rotate((ch[y][0] == x ^ ch[fa[y]][0] == y) ? x : y);Rotate(x);}up(x);}void access(int x) {int t = 0;while(x) {splay(x);ch[x][1] = t;t = x; x = fa[x];}}void makeroot(int x) {access(x); splay(x); rev[x] ^= 1;}void link(int x, int y) {makeroot(x); fa[x] = y; }void cut(int x, int y) {makeroot(x); access(y); splay(y); ch[y][0] = fa[x] = 0;}int query(int x, int y) {makeroot(x); access(y); splay(y); return MAX[y];}
} sp;
int fa[MAXNODE+10], n, m, ans = INF;
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);
}
struct Node {int u, v, a, b;bool operator < (const Node &t) const {return a < t.a;}
} E[MAXM+10];
int main() {SF("%d%d", &n, &m);for(int i = 1; i <= n; i++) fa[i] = i;for(int i = 1; i <= m; i++) SF("%d%d%d%d", &E[i].u, &E[i].v, &E[i].a, &E[i].b);sort(E+1, E+1+m);for(int i = 1; i <= m; i++) {sp.val[n+i] = E[i].b;sp.MAX[n+i] = n+i;}for(int i = 1; i <= m; i++) {int u = E[i].u, v = E[i].v, wt = E[i].b;int x = find(u), y = find(v);if(x != y) {fa[x] = y;sp.link(u, n+i); sp.link(v, n+i);}else {int t = sp.query(u, v);if(wt < sp.val[t]) {sp.cut(E[t-n].u, t); sp.cut(E[t-n].v, t);sp.link(u, n+i); sp.link(v, n+i);}}if(find(1) == find(n)) ans = min(ans, sp.val[sp.query(1, n)] + E[i].a);}PF("%d", ans == INF ? -1 : ans);
}


这篇关于[BZOJ3669][Noi2014]魔法森林 LCT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/464915

相关文章

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显

玩转Python Turtle库,实现满屏飘字的魔法!

前言     本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Python环境。然后,你需要安装或更新Turtle库(通常Python安装时自带了Turtle库)。 二、编写代码 接下来,我们将通过编写一个简单的P

重复采样魔法:用更多样本击败单次尝试的最强模型

这篇文章探讨了通过增加生成样本的数量来扩展大型语言模型(LLMs)在推理任务中的表现。 研究发现,重复采样可以显著提高模型的覆盖率,特别是在具有自动验证工具的任务中。研究还发现,覆盖率与样本数量之间的关系可以用指数幂律建模,揭示了推理时间的扩展规律。尽管多数投票和奖励模型在样本数量增加时趋于饱和,但在没有自动验证工具的任务中,识别正确样本仍然是一个重要的研究方向。 总体而言,重复采样提供了一种

【异常点检测 孤立森林算法】10分钟带你了解下孤立森林算法

孤立森林(isolation Forest)算法,2008年由刘飞、周志华等提出,算法不借助类似距离、密度等指标去描述样本与其他样本的差异,而是直接去刻画所谓的疏离程度(isolation),因此该算法简单、高效,在工业界应用较多。 用一个例子来说明孤立森林的思想:假设现在有一组一维数据(如下图),我们要对这组数据进行切分,目的是把点A和 B单独切分出来,先在最大,值和最小值之间随机选择一个值

数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解

本文逻辑: 本文由二叉树的遍历起手,讲解了二叉树的三种遍历方式,以及如何构造一颗二叉树,并在此基础上,扩展了更好的二叉树-线索二叉树。树和森林的存储结构讲解中,重点就是将树与森林转换为二叉树,这样二叉树的手段就能使用到树与森林当中。最后,讲解了二叉树与森林的遍历。 文章目录 1.二叉树的遍历1.1 二叉树的前,中,后序遍历1.2 二叉树的层次遍历1.3构造二叉树 2.线索二叉树2.1

随机森林的知识博客:原理与应用

随机森林(Random Forest)是一种基于决策树的集成学习算法,它通过组合多棵决策树的预测结果来提升模型的准确性和稳健性。随机森林具有强大的分类和回归能力,广泛应用于各种机器学习任务。本文将详细介绍随机森林的原理、构建方法及其在实际中的应用。 1. 随机森林的原理 1.1 集成学习(Ensemble Learning) 在机器学习中,集成学习是一种通过结合多个模型的结果来提高预测性能的

07_TensorFlow2图像编解码大揭秘:让图片说‘变’就‘变’,魔法还是科技?

1. 图像的编码和解码 在实际应用中,图像数据源格式多种多样,如:png\jpg\bmp等,而神经网络训练模型所需的图像的数据格式为:图像字节数据或Base64编码数据等。基于此,将png\jpg\bmp等格式的图像转换为字节数据的过程称为图像编码,将字节数据的图像转换为png\jpg\bmp等格式图像的过程称为图像解码。 2. 图像编码 Tensorflow图像编码的过程如下图所示,分

【Jupyter】 Notebook 中的 IPython 魔法:12个必知实用技巧

Jupyter Notebook 作为一个强大的交互式计算环境,结合 IPython 的功能,为数据科学家和程序员提供了丰富的工具。本文将介绍12个在 Jupyter Notebook 中使用 IPython 的实用技巧 1. 清除输出:使用 clear_output() from IPython.display import clear_output# 执行一些操作print("This

【机器学习】梯度提升和随机森林的概念、两者在python中的实例以及梯度提升和随机森林的区别

引言 梯度提升(Gradient Boosting)是一种强大的机器学习技术,它通过迭代地训练决策树来最小化损失函数,以提高模型的预测性能 随机森林(Random Forest)是一种基于树的集成学习算法,它通过组合多个决策树来提高预测的准确性和稳定性 文章目录 引言一、梯度提升1.1 基本原理1.1.1 初始化模型1.1.2 迭代优化1.1.3 梯度计算1.1.4模型更新 1.2

【HDU】5333 Undirected Graph【LCT+BIT】

传送门:【HDU】5333 Undirected Graph my  code: my~~code: #pragma comment(linker, "/STACK:1024000000")#include <stdio.h>#include <string.h>#include <map>#include <algorithm>using namespace std ;typed