「CF827D Best Edge Weight」 - LCT

CF827D Best Edge Weight

tags:LCT

题意

给你一张有边权的简单图,现在要求对于每一条边求出,这条边的边权最大为多少时,它还能出现在所有可能的最小生成树上,如果对于任意边权都出现,则输出 -1

题解

分类讨论

  1. 这条边在最小生成树上,那么就是所有可以取代这条边的非树边的最小值-1
  2. 这个边不在最小生成树上,那么就是这条边可以取代的树边是最小值-1

直接 LCT 维护即可,时间复杂度 \(O(n\log n)\)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
template<typename T>void rd(T&x){int f=0,c;while((c=getchar())<48||57<c)f^=!(c^45);x=(c&15);while(47<(c=getchar())&&c<58)x=x*10+(c&15);if(f)x=-x;}
template<typename T>T max(const T&x,const T&y){return x<y?y:x;}
template<typename T>T min(const T&x,const T&y){return x<y?x:y;}
const int N=400005,INF=0x3f3f3f3f;
int n,m,ans[N],st[N],val[N],fa[N],rev[N],tag[N],mx[N],ch[N][2];bool vis[N];
struct edge{int u,v,w,id;bool operator<(const edge&b)const{return w<b.w;}}e[N];
int get(int u){return ch[fa[u]][1]==u;}
int isroot(int u){return ch[fa[u]][0]!=u&&ch[fa[u]][1]!=u;}
void update(int u){mx[u]=max(val[u],max(mx[ch[u][0]],mx[ch[u][1]]));}
void puttag(int u,int w){ans[u]=min(ans[u],w),tag[u]=min(tag[u],w);}
void pushdown(int u){
    if(rev[u])std::swap(ch[u][0],ch[u][1]),rev[ch[u][0]]^=1,rev[ch[u][1]]^=1,rev[u]^=1;
    if(tag[u]!=INF)puttag(ch[u][0],tag[u]),puttag(ch[u][1],tag[u]),tag[u]=INF;
}
void rotate(int u){
    int p=fa[u],gp=fa[p],x=get(u);
    if(!isroot(p))ch[gp][get(p)]=u;fa[u]=gp;
    ch[p][x]=ch[u][x^1],fa[ch[u][x^1]]=p;
    ch[u][x^1]=p,fa[p]=u;
    update(p),update(u);
}
void splay(int u){
    st[*st=1]=u;
    for(int i=u;!isroot(i);i=fa[i])st[++*st]=fa[i];
    for(int i=*st;i>=1;--i)pushdown(st[i]);
    for(;!isroot(u);rotate(u))
        if(!isroot(fa[u]))
            rotate(get(u)==get(fa[u])?fa[u]:u);
}
void access(int u){
    for(int i=0;u;i=u,u=fa[u]){
        splay(u);
        ch[u][1]=i;
        update(u);
    }
}
void makeroot(int u){
    access(u);
    splay(u),rev[u]^=1;
}
void link(int u,int v){
    makeroot(u),fa[u]=v;
}
int findroot(int u){
    access(u),splay(u);
    while(ch[u][0])u=ch[u][0];
    return u;
}
int main(){
    memset(ans,63,sizeof(ans)),memset(tag,63,sizeof(tag));
    rd(n),rd(m);rep(i,1,m)rd(e[i].u),rd(e[i].v),rd(e[i].w),e[i].id=i;std::sort(e+1,e+1+m);
    rep(i,1,m){
        int u=e[i].u,v=e[i].v,w=e[i].w,id=e[i].id+n;
        if(findroot(u)!=findroot(v)){
            val[id]=w;
            link(u,id);
            link(v,id);
            vis[id]=1;
        }else{
            makeroot(u),access(v),splay(v);
            ans[id]=mx[v]-1;
            puttag(v,w);
        }
    }
    rep(i,n+1,n+m){
        if(vis[i]){
            access(i),splay(i);
            if(ans[i]!=INF)printf("%d ",ans[i]-1);else printf("%d ",-1);
        }else printf("%d ",ans[i]);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/xay5421/p/CF827D.html

时间: 2024-10-13 20:07:15

「CF827D Best Edge Weight」 - LCT的相关文章

「kuangbin带你飞」专题十二 基础DP

layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 传送门 A.HDU1024 Max Sum Plus Plus 题意 给你N个数,然后你分成M个不重叠部分,并且这M个不重叠部分的和最大. 思路 动态规划最大m字段和,dp数组,dp[i][j]表示以a[j]结尾的,i个字段的最大和 两种情况:1.第a[j

「csp校内训练 2019-10-24」解题报告

「csp校内训练 2019-10-24」解题报告 T1.猴猴吃苹果 \(Description\) 猴猴最喜欢在树上玩耍,一天猴猴又跳上了一棵树,这棵树有 \(N \ (N \leq 50000)\) 个苹果,每个苹果有一个编号,分别为 \(0\) ~ \(N - 1\) 它们之间由 \(N-1\) 个树枝相连,猴猴可以从树枝的一端爬到树枝的另一端,所以猴猴可以从任意一个苹果的位置出发爬到任意猴猴想去的苹果的位置. 猴猴开始在编号为 \(K \ (K < N)\) 的苹果的位置,并且把这个苹果吃

「csp校内训练 2019-10-30」解题报告

「csp校内训练 2019-10-30」解题报告 T1.树 题目链接(逃) \(Description\): 现在有一棵树,共 \(N\) 个节点. 规定:根节点为 \(1\) 号节点,且每个节点有一个点权. 现在,有 \(M\) 个操作需要在树上完成,每次操作为下列三种之一: \(1 \ x \ a\):操作 \(1\),将节点 \(x\) 点权增加 \(a\). \(2 \ x \ a\):操作 \(2\),将以节点 \(x\) 为根的子树中所有点的权值增加 \(a\). \(3 \ x\)

CSS无需Webfont实现近似「微软雅黑Light」的字体效果

在网页制作中,美观的字体能很大程度上提升一个网页的整体外观浏览效果(说白了就是提升逼格),但受各种因素的影响(例如中文字体应用Webfont的麻 烦),使开发者在制作过程中不得不使用“Web安全字体”,这使网页的外观效果大幅下降.今天在改模板的过程中偶然发现一个很笨的方法,实现近似微软雅黑 Light的字体效果. 实际上「微软雅黑Light」字体就是相对于「微软雅黑」字体较细,但是它的显示效果却要让人觉得舒适很多,只要字体不会太小,显示效果还是不错的. 所以直接用font-weight属性设置字

Linux 小知识翻译 - 「协议(protocol)」

对于理解服务器和网络来说,「协议」是不可缺少的概念. 「协议(protocol)」有「规则,规定」的意思. 实际上「协议」的函数很广,在通信领域,「协议」规定了「在通信时,什么样的情况下,以什么样的顺序,什么样的方式交互什么样的数据」. 抽象的去理解「协议」可能会比较困难,下面来举个例子. 通过Web以HTML方式交互时使用的协议是「HTTP」(Hyper Text Transfer Protocol).这个协议最重要的就是规定了服务器和客户端之间以HTML方式交互的规则. 比如,客户端连接上服

苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b

WWDC2016 搜索广告分会视频和 PPT 发布了,ASO100 带开发者第一时间了解 Search Ads 后台设置(文末有原声视频). 首先介绍一下搜索广告的模式和竞价规则 广告模式为 CPT(Cost Per Tap,按点击收费),类似于国内的 CPC 广告模式.广告的展示受两个因素的影响:相关性与出价. 如下图,所有相关性低的广告都不被展示(无论出价高低),相关性相差不多时,展示出价高的广告. 苹果根据两方面来判断相关性,一是 App 文本的元数据(来源于描述等位置),二是用户点击广告

翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述

本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker. 该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scott Meyers推荐,全文共分11个部分,我将利用业余时间,分别翻译. 受笔者水平所限,可能叙述会出现些许问题,还望多多指正. 部分名词为了保持含义和方便理解,并未翻译成中文,有的在括号内给出了常见的中文翻译. 目录 概述 Move语义 右值引用 强制Move语义 右值引用就是右值吗? Move语义

XCActionBar 「Xcode 中的 Alfred」

下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 (2)「command+option+7」或者双击「alt」键可以执行「上次的动作」 编程时可用于双击或三击事件的按键分别为如下5个: (1)「alt」:NSAlternateKeyMask (2)「command」:NSCommandKeyMask (3)「control」:NSControlKey

通俗解释「为什么数据库难以拓展」

"如何通俗解释「为什么数据库难以拓展」",这个问题来自 Quora,题主还补充说自己有一些数据库的基本知识,但依然不理解为什么扩展数据库如此困难.伯乐在线编译摘编了这个问答贴的两个热门回复. Paul King , Facebook 数据科学家(3.6K 赞) 要扩展数据库有四大挑战:搜索.并发性.一致性和速度. 假设你有一张清单,上面有10个人名.如果你想要查找某个人,只需要看一眼清单就行. 但如果清单上有100万个人名呢?这时,你就需要一些策略了.电话簿把人名按照字母顺序排列,这样