Description

Link.

修改边权的动态 MST。

Solution

讲清楚点。

修改边权的 MST,考虑对时间分治。设我们当前操作的操作区间是 \([l,r]\),直接暴力找 MST 是不行的。

考虑找出必要的边和必不要的边。

  • 若把 \([l,r]\) 操作中的边边权改成 \(+\infty\),拿原图点集和不包含 \([l,r]\) 中边的边集和 \([l,r]\) 中边权修改为 \(+\infty\) 后的边的集合的并集作为边集跑 MST,此时如果不在 MST 上的边一定不在最终的 MST 边集中。

  • 同理,改成 \(-\infty\),此时在 MST 边集里的边一定在最终的 MST 边集中。

这样暴力跑 Kruskal 的规模保证在了 \(O(r-l+1)\)。

复杂度 \(O(n\log_{2}^{2}n)\)。

#include<bits/stdc++.h>
const int INF=std::numeric_limits<int>::max();
struct edge
{
int fr,ba,val,ID;
edge():fr(0),ba(0),val(0),ID(0){}
edge(int _fr,int _ba,int _val,int _id):fr(_fr),ba(_ba),val(_val),ID(_id){}
friend bool operator < (const edge &lhs,const edge &rhs){return lhs.val<rhs.val;}
}edge_set[20][100010],ori_edge[100010],tmp_edge[100010];
struct oper
{
int ID,val;
oper():ID(0),val(0){}
oper(int _id,int _val):ID(_id),val(_val){}
}ope[100010];
int tagcur[100010],tagope[100010],n,m,q,size_v[20],size_e[20],ver_set[20][100010],wgt[100010],srt[100010];
struct DSU
{
int fa[100010];
int f(int i){return fa[i];}
void clear(int l){std::iota(fa+1,fa+l+1,1);}
int find(int x){return (x^fa[x])?fa[x]=find(fa[x]):x;}
bool merge(int x,int y){x=find(x),y=find(y); if(x^y) return fa[x]=y,true; else return false;}
}dsu;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^'0'),c=getchar();
if(~f) return x;
else return -x;
}
int wrstk[100];
void write(long long x,char las='\n')
{
int top=0;
if(x<0) x=-x,putchar('-');
do wrstk[++top]=x%10,x/=10; while(x);
while(top) putchar(wrstk[top--]^'0');
putchar(las);
}
void rawgrass(int l,int r,int dep,long long ans)
{
const int &n=size_v[dep],&m=size_e[dep];
if(l^r)
{
for(int i=1;i<=m;++i) tagope[edge_set[dep][i].ID]=0;
for(int i=l;i<=r;++i) tagcur[ope[i].ID]=1;
for(int i=1;i<=m;++i)
{
tmp_edge[i]=edge_set[dep][i];
if(tagcur[tmp_edge[i].ID]) tmp_edge[i].val=INF;
}
std::sort(tmp_edge+1,tmp_edge+m+1);
dsu.clear(n);
for(int i=1;i<=m;++i) if(!dsu.merge(tmp_edge[i].fr,tmp_edge[i].ba) && tmp_edge[i].val!=INF) tagope[tmp_edge[i].ID]=-1;
for(int i=l;i<=r;++i) tagcur[ope[i].ID]=1;
for(int i=1;i<=m;++i)
{
tmp_edge[i]=edge_set[dep][i];
if(tagcur[tmp_edge[i].ID]) tmp_edge[i].val=-INF;
}
std::sort(tmp_edge+1,tmp_edge+m+1);
dsu.clear(n);
for(int i=1;i<=m;++i) if(dsu.merge(tmp_edge[i].fr,tmp_edge[i].ba) && tmp_edge[i].val!=-INF) tagope[tmp_edge[i].ID]=1;
for(int i=l;i<=r;++i) tagcur[ope[i].ID]=0;
size_v[dep+1]=size_e[dep+1]=0;
dsu.clear(n);
for(int i=1;i<=m;++i) if(tagope[edge_set[dep][i].ID]==1) dsu.merge(edge_set[dep][i].fr,edge_set[dep][i].ba);
for(int i=1;i<=n;++i) if(dsu.f(i)==i) ver_set[dep+1][++size_v[dep+1]]=ver_set[dep][i],srt[i]=size_v[dep+1];
for(int i=1;i<=m;++i)
{
if(tagope[edge_set[dep][i].ID]==1) ans+=edge_set[dep][i].val;
else if(tagope[edge_set[dep][i].ID]==0)
{
int x=edge_set[dep][i].fr,y=edge_set[dep][i].ba;
x=dsu.find(x),y=dsu.find(y);
if(x^y) edge_set[dep+1][++size_e[dep+1]]=edge(srt[x],srt[y],edge_set[dep][i].val,edge_set[dep][i].ID);
}
}
int mid=(l+r)>>1;
rawgrass(l,mid,dep+1,ans);
for(int i=l;i<=mid;++i) wgt[ope[i].ID]=ope[i].val;
for(int i=1;i<=size_e[dep+1];++i) if(wgt[edge_set[dep+1][i].ID]!=INF) edge_set[dep+1][i].val=wgt[edge_set[dep+1][i].ID];
for(int i=l;i<=mid;++i) wgt[ope[i].ID]=INF;
rawgrass(mid+1,r,dep+1,ans);
}
else
{
for(int i=1;i<=m;++i)
{
tmp_edge[i]=edge_set[dep][i];
if(tmp_edge[i].ID==ope[l].ID) tmp_edge[i].val=ope[l].val;
}
std::sort(tmp_edge+1,tmp_edge+m+1);
dsu.clear(n);
for(int i=1;i<=m;++i) if(dsu.merge(tmp_edge[i].fr,tmp_edge[i].ba)) ans+=tmp_edge[i].val;
write(ans);
}
}
int main()
{
n=read(),m=read(),q=read();
for(int i=1,x,y,z;i<=m;++i) x=read(),y=read(),z=read(),ori_edge[i]=edge(x,y,z,i);
for(int i=1,id,k;i<=q;++i) id=read(),k=read(),ope[i]=oper(id,k);
size_v[0]=n;
size_e[0]=m;
for(int i=1;i<=size_v[0];++i) ver_set[0][i]=i;
for(int i=1;i<=size_e[0];++i) edge_set[0][i]=ori_edge[i],wgt[i]=INF;
rawgrass(1,q,0,0);
return 0;
}

Solution -「HNOI 2010」城市建设的更多相关文章

  1. Solution -「HNOI 2009」「洛谷 P4727」图的同构计数

    \(\mathcal{Description}\)   Link.   求含 \(n\) 个点的无标号简单无向图的个数,答案模 \(997\). \(\mathcal{Solution}\)   首先 ...

  2. Solution -「HNOI 2019」「洛谷 P5293」白兔之舞

    \(\mathcal{Description}\)   Link.   不想概括题意.jpg \(\mathcal{Solution}\)   定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...

  3. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  4. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  5. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  6. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  7. Solution -「JOISC 2021」「LOJ #3491」道路建设

    \(\mathcal{Description}\)   Link.   平面上有 \(n\) 个互不重合的点 \((x_{1..n},y_{1..n})\),求其两两曼哈顿距离的前 \(m\) 小值. ...

  8. Solution -「JOISC 2019」「LOJ #3036」指定城市

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...

  9. Solution -「HNOI」EVACUATE

    Sol. 可以发现人的移动除了不能穿墙以外没有别的限制.也就是说人的移动多半不是解题的突破口. 接下来会发现出口的限制很强,即出口每个时刻只能允许一个人出去. 每个时刻? 不难想到对于每一个时刻每一个 ...

  10. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

随机推荐

  1. GTX.Zip:一款可以替代 gzip 的基因大数据压缩软件

    今天给大家推荐一款基因大数据压缩的大杀器:GTX.Zip. GTX.Zip 这款软件是由曾在 2016 年 GCTA 风云挑战赛中的那匹黑马--人和未来生物科技有限公司开发的,而当时他们也是打破了基因 ...

  2. c++中vector容器的用法

    C语言中const关键字是constant的缩写,通常翻译为常量.常数等,它可以修饰变量.数组.指针.函数参数. vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器.ve ...

  3. 大数据实战手册-开发篇之pycharm远程开发调试

    2.1 pycharm远程开发调试 2.1.1 python版本一致 #版本都保持3.6.6 #root cd /usr/local/python3/bin/pip3 list 备注:[python模 ...

  4. 文献精读1:SpikTransformer

    Spikformer code source(pku):GitHub - ZK-Zhou/spikformer: ICLR 2023, Spikformer: When Spiking Neural ...

  5. 细节决定成败,聊聊JS的类型(上)

    今天我们来讲讲 JavaScript 的内容,在这个部分,我首先想跟你聊一聊类型. JavaScript 类型对每个前端程序员来说,几乎都是最为熟悉的概念了.但是你真的很了解它们吗?我们不妨来看看下面 ...

  6. Spring Loaded代码热更新实践和原理分析

    1.引言 开发者在编码效率和快速迭代中的痛点场景包括: 修改代码后,需要频繁重启应用,导致开发效率低下: 实时调试时,不能立即看到代码修改的结果: 大型项目中,重启的时间成本较高. 针对这些问题,本文 ...

  7. 行行AI人才直播第7期:奇计AI创始人左晟《AI时代的商业挑战和机遇》

    行行AI人才是博客园和顺顺智慧共同运营的AI行业人才全生命周期服务平台,是园子商业化努力的一个重要方向. 行行AI人才直播希望以直播的方式让大家更多了解AI行业的现状与未来可能的发展方向. 随着人工智 ...

  8. 通用权限系统-Spring-Boot-Starter

    Spring-Boot-Starter 自定义Starter 案例一:读取application.yml中的参数 1.创建 1.创建maven工程hello-spring-boot-starter 2 ...

  9. 【小小demo】Springboot + Vue 增删改查

    vue-table-ui 该工程提供的是 一个简单的 Vue + Element-UI 的表格,增删改查操作. 工程代码在最下面. 环境 jdk1.8 idea maven springboot 2. ...

  10. 一步一图带你构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射

    笔者之前在自己的专栏<聊聊 Linux 内核> 里通过大量的篇幅写了一个系列关于内存管理相关的文章,在这个系列文章中,笔者分别通过虚拟内存管理和物理内存管理两个角度算是把 Linux 内存 ...