[UOJ 3]【NOI2014】魔法森林:LCT

2024-01-10 18:58
文章标签 森林 魔法 uoj lct noi2014

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

点击这里查看原题

将所有路径按a升序排序,用LCT维护路径上最大的b,将边权化为点权,如果加入一条边x,其两端点分别为u,v,那么将u与i+x连边,v与i+x连边。
如果(u,v)路径最大的b值大于当前边的b,那么删去b最大的边。
注意:access操作中必须pushup,因为这个调了好久

/*
User:Small
Language:C++
Problem No.:3
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 99999999
using namespace std;
const int M=200005;
int n,m,pre[M],fa[M],ch[M][2],val[M],mx[M],stk[M],ans=inf;
bool rev[M];
struct edge{int u,v,a,b;bool operator<(const edge &y)const{return a<y.a;}
}e[M];
bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
}
bool get(int x){return ch[fa[x]][1]==x;
}
void pushup(int rt){int &l=ch[rt][0],&r=ch[rt][1];mx[rt]=rt;if(val[mx[l]]>val[mx[rt]]) mx[rt]=mx[l];if(val[mx[r]]>val[mx[rt]]) mx[rt]=mx[r];
}
void pushdown(int rt){int &l=ch[rt][0],&r=ch[rt][1];if(rev[rt]){rev[rt]^=1;rev[l]^=1;rev[r]^=1;swap(l,r);}
}
void rotate(int x){int y=fa[x],z=fa[y],side=get(x);if(!isroot(y)) ch[z][ch[z][1]==y]=x;fa[x]=z;ch[y][side]=ch[x][side^1];fa[ch[y][side]]=y;ch[x][side^1]=y;fa[y]=x;pushup(y);pushup(x); 
}
void splay(int x){int tp=0;stk[++tp]=x;for(int u=x;!isroot(u);u=fa[u]) stk[++tp]=fa[u];while(tp) pushdown(stk[tp--]);while(!isroot(x)){int y=fa[x];if(!isroot(y)) rotate(get(x)==get(y)?y:x);rotate(x);}
}
void access(int x){int t=0;for(int t=0;x;t=x,x=fa[x]){splay(x);ch[x][1]=t;pushup(x);}
}
void makeroot(int x){access(x);splay(x);rev[x]^=1;
}
void link(int x,int y){makeroot(x);fa[x]=y;splay(x);
}
void cut(int x,int y){makeroot(x);access(y);splay(y);fa[x]=ch[y][0]=0;
}
int query(int x,int y){makeroot(x);access(y);splay(y);return mx[y];
}
int find(int x){return x==pre[x]?x:pre[x]=find(pre[x]);
}
int main(){freopen("data.in","r",stdin);//ios::sync_with_stdio(false);cin>>n>>m;for(int i=1;i<=n;i++) pre[i]=i;for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].a>>e[i].b;sort(e+1,e+m+1);for(int i=1;i<=m;i++){int u=e[i].u,v=e[i].v;if(find(u)==find(v)){int t=query(u,v);if(val[t]<=e[i].b) continue;cut(t,e[t-n].u);cut(t,e[t-n].v);}else pre[find(u)]=find(v);val[i+n]=e[i].b;mx[i+n]=i+n;link(u,i+n);link(v,i+n);if(find(1)==find(n)) ans=min(ans,e[i].a+val[query(1,n)]);}if(ans==inf) ans=-1;cout<<ans<<endl;return 0;
}

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



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

相关文章

探索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