ABC 364 F - Range Connect MST 题解
一副扑克牌,去掉 1 到 K,剩下就是我,赛后十秒过,我是 joker。🤡
视
最原始的做法,把
这样肯定过不了。注意到,对于
考虑连边。把
由于连边的次数不会太多,是
点击开 D
const int N=200099;
int n,q,tr[N<<2]={},fa[N<<1]={};
ll ans=0;
int father(int x) { return fa[x]=fa[x]==x?x:father(fa[x]); }
void link(int x,int y) { return fa[father(y)]=father(x),void(); }
bool same(int x,int y) { return father(x)==father(y); }
struct edge {
int l,r; ll c;
friend bool operator < (const edge a,const edge b) {
return a.c<b.c;
}
} e[N]={};
#define lson (x<<1)
#define rson (x<<1|1)
void update(int x) {
tr[lson]=father(tr[lson]),tr[rson]=father(tr[rson]);
if(!tr[lson]||!tr[rson]) tr[x]=0;
else if(same(tr[lson],tr[rson])) tr[x]=father(tr[lson]);
else tr[x]=0;
return ;
}
void setup(int x,int l,int r) {
if(l==r) return tr[x]=l,void();
int mid=l+r>>1;
setup(lson,l,mid),setup(rson,mid+1,r);
return update(x);
}
void link(int x,int l,int r,int p,ll cost) {
if(tr[x]) {
if(!same(tr[x],p))
link(tr[x],p),ans+=cost;
if(l==r) tr[x]=father(l); else update(x);
return ;
}
if(l==r) return ;
int mid=l+r>>1;
link(lson,l,mid,p,cost);
link(rson,mid+1,r,p,cost);
update(x);
return ;
}
void change(int x,int l,int r,int L,int R,int p,ll cost) {
if(L<=l&&r<=R) return link(x,l,r,p,cost);
int mid=l+r>>1;
if(L<=mid) change(lson,l,mid,L,R,p,cost);
if(mid<R) change(rson,mid+1,r,L,R,p,cost);
update(x);
return ;
}
int main()
{
// usefile("mst");
int i;
read(n,q);
for(i=1;i<=q;++i)
read(e[i].l,e[i].r,e[i].c);
for(i=1;i<=n+q;++i)
fa[i]=i;
sort(e+1,e+1+q);
setup(1,1,n);
for(i=1;i<=q;++i)
change(1,1,n,e[i].l,e[i].r,n+i,e[i].c);
for(i=1;i<=n+q;++i)
if(!same(i,1)) {
printf("-1\n");
return 0;
}
printf("%lld\n",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下