传送门
先把边双连通分量用圆方树一样的方法缩点,然后把新建的树树剖维护。
注意对于边双连通分量需要维护动态最小值,可以用multisetmultisetmultiset。
代码:

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline int read(){int ans=0;char ch=getchar();while(!isdigit(ch))ch=getchar();while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans;
}
const int N=2e5+5,M=3e5+5;
int siz[N],w[N<<1],top[N],dep[N],pred[N],hson[N],num[N],dfn[N],low[N],tot=0,sig=0,n,m,q,blo[N],stk[N],Top=0,fa[N];
struct Node{int l,r,mn;}T[N<<2];
vector<int>g[N],e[N<<1];
multiset<int>W[N<<1];
inline void tarjan(int p,int pre){dfn[p]=low[p]=++tot,stk[++Top]=p;for(int i=0;i<g[p].size();++i){int v=g[p][i];if(v==pre)continue;if(!dfn[v]){tarjan(v,p),low[p]=min(low[p],low[v]);if(low[v]>=dfn[p]){int tmp;++sig,e[p].push_back(sig);do tmp=stk[Top--],blo[tmp]=sig,e[sig].push_back(tmp),W[sig].insert(w[tmp]);while(tmp^v);w[sig]=*(W[sig].begin());}}else low[p]=min(low[p],dfn[v]);}
}
inline void dfs1(int p){siz[p]=1;for(int i=0;i<e[p].size();++i){int v=e[p][i];if(v==fa[p])continue;fa[v]=p,dep[v]=dep[p]+1,dfs1(v),siz[p]+=siz[v];if(siz[v]>siz[hson[p]])hson[p]=v;}
}
inline void dfs2(int p,int tp){top[p]=tp,pred[num[p]=++tot]=p;if(!hson[p])return;dfs2(hson[p],tp);for(int i=0;i<e[p].size();++i){int v=e[p][i];if(v!=fa[p]&&v!=hson[p])dfs2(v,v);}
}
inline void pushup(int p){T[p].mn=min(T[lc].mn,T[rc].mn);}
inline void build(int p,int l,int r){T[p].l=l,T[p].r=r;if(l==r){T[p].mn=w[pred[l]];return;}build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int k,int v){if(T[p].l==T[p].r){T[p].mn=v;return;}if(k<=mid)update(lc,k,v);else update(rc,k,v);pushup(p);
}
inline int query(int p,int ql,int qr){if(ql<=T[p].l&&T[p].r<=qr)return T[p].mn;if(qr<=mid)return query(lc,ql,qr);if(ql>mid)return query(rc,ql,qr);return min(query(lc,ql,mid),query(rc,mid+1,qr));
}
inline int ask(int x,int y){int ret=1e9;while(top[x]^top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);ret=min(ret,query(1,num[top[x]],num[x])),x=fa[top[x]];}if(dep[x]<dep[y])swap(x,y);ret=min(query(1,num[y],num[x]),ret);if(y>n&&fa[y])ret=min(ret,w[fa[y]]);return ret;
}
inline void modify(int p,int v){if(blo[p]){set<int>::iterator it=W[blo[p]].find(w[p]);W[blo[p]].erase(it),W[blo[p]].insert(v),w[blo[p]]=*(W[blo[p]].begin()),update(1,num[blo[p]],w[blo[p]]);}w[p]=v,update(1,num[p],v);
}
int main(){sig=n=read(),m=read(),q=read();for(int i=1;i<=n;++i)w[i]=read();for(int i=1,u,v;i<=m;++i)u=read(),v=read(),g[u].push_back(v),g[v].push_back(u);tarjan(1,0),dfs1(1),tot=0,dfs2(1,1),build(1,1,sig);for(int i=1,x,y;i<=q;++i){char s[5];scanf("%s",s),x=read(),y=read();if(s[0]=='C')modify(x,y);else printf("%d\n",ask(x,y));}
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10084729.html

2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)相关推荐

  1. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  2. 【CF487E】Tourists【圆方树】【树链剖分】【multiset】

    题意:给一张 nnn 点 mmm 边的连通无向图,点帯权,qqq 次操作: 修改一个点的权值. 询问两点间所有简单路的最小权值的最小值. n,m,q≤105n,m,q\leq 10^5n,m,q≤10 ...

  3. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

  4. 【YBT2022寒假Day8 A】染色计划(Tarjan)(线段树优化建边)(树链剖分)

    染色计划 题目链接:YBT2022寒假Day8 A 题目大意 给你一棵树,然后有 k 中颜色,每个点有一个颜色,然后问你要修改多少次,才能使得一个存在的颜色的所有点构成一个连通块. 一个修改操作指选择 ...

  5. 数据结构课程设计-神秘国度的爱情故事-LCA:tarjan+离线/树链剖分/暴力

    1.无脑暴力dfs:   O(n*m) 2.LCA/tarjan+离线处理: O(n+m) 3.LCA/树链剖分: O(nlogn+m)~O(nlogn+mlogn) 4.LCA/倍增思想(有空再补) ...

  6. CF487E Tourists(圆方树+树链剖分)

    洛谷题目传送门 解题思路 不会圆方树的可以看我的博客圆方树学习记录及例题 首先Tarjan寻找点双连通分量,然后建立圆方树,每个方点存这个点双内的最小点权 将圆方树树链剖分之后,对于修改操作,将这个点 ...

  7. 广义圆方树+树链剖分+set(Codeforces Round #278 (Div. 1): E. Tourists)

    前置:双联通分量.圆方树.树链剖分 什是是广义圆方树 圆方树是针对于仙人掌建树,而广义圆方树是针对无向图建树,对于一个无向图 无向图中的所有点 → 广义圆方树中的所有圆点 无向图中的一个双联通分量 → ...

  8. [树链剖分][圆方树] Jzoj P5909 跑商

    Description 题目背景: 尊者神高达很穷,所以他需要跑商来赚钱 题目描述: 基三的地图可以看做 n 个城市,m 条边的无向图,尊者神高达会从任意一个点出发并在起点购买货物,在旅途中任意一点卖 ...

  9. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

最新文章

  1. Linux下批量kill掉进程
  2. 区块链80%项目靠同一个故事拿钱,但标准链说最坏的时机就是好的开始
  3. 4路组相连cache设计_Cache组织方式
  4. delete from表名和truncate table 表名的区别
  5. c语言编写程序计算行列式值,新手作品:行列式计算C语言版
  6. spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict
  7. php实现ftp上传,PHP_PHP实现ftp上传文件示例,FTP上传是PHP实现的一个常见且 - phpStudy...
  8. vue-cli脚手架中webpack配置基础文件详解
  9. python中import文件_Python导入其他文件中的.py文件 即模块
  10. java与C++不同之处(java不支持特性)
  11. JavaNIO - Scatter Gather
  12. RestTemplate使用笔记
  13. Thread 相关函数和属性
  14. 7 php程序的调试方法_PHP 程序员的调试技术
  15. mysql字符类型_MySQL学习分享--字符类型
  16. multisim 10 基本分析法的应用1
  17. antd 项目中使用iconfont图标
  18. Excel删除重复项,不保留重复项数据
  19. 手机丢了微信聊天记录怎么恢复?别担心,教你一招找回
  20. linux物联网项目,6个开源项目提升物联网开发效率

热门文章

  1. from...import 和 import 的区别
  2. 高性能日志框架 Log4a 原理分析
  3. The fall of RNN / LSTM
  4. python数据分析第三方库是_python数据分析复盘——数据分析相关库之Pandas
  5. linux dns语法检测工具,DNS解析检查工具之nslookup
  6. 洗衣机,数据挖掘的物理模型
  7. 研究动机(Motivation)-如何写好科技论文之我见(一)
  8. ERP(Enterprise Resource Planning)
  9. 数据挖掘的一个完整过程
  10. ICCV 2017 PTAV:《Parallel Tracking and Verifying:A Framework for Real-Time and High Accuracy ...》论文笔记