分析:

圆方树板子题。

每个点方点放个multiset维护其子圆点的最小值

询问和修改用树剖

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#define SF scanf
#define PF printf
#define MAXN 200010
#define INF 0x3FFFFFFF
using namespace std;
typedef pair<int,int> pii;
struct node{int u,v;node () {}node (int u1,int v1):u(u1),v(v1) {}
}Edge[MAXN];
int dfn[MAXN],low[MAXN],cnt;
vector<int> a[MAXN];
int st[MAXN],tp,n2,tot;
void dfs(int x,int fa=0){dfn[x]=low[x]=++cnt;  st[++tp]=x;for(int i=0;i<int(a[x].size());i++){int u=a[x][i];if(u==fa)continue;if(dfn[u]==0){dfs(u,x);low[x]=min(low[x],low[u]);if(low[u]>=dfn[x]){n2++;Edge[++tot]=node(n2,x);while(1){Edge[++tot]=node(n2,st[tp]);if(st[tp--]==u)break;  }}}elselow[x]=min(low[x],dfn[u]);}
}
multiset<int> val[MAXN];
int son[MAXN],siz[MAXN];
int w[MAXN],n;
void prepare(int x,int fa=0){if(fa>n)val[fa].insert(w[x]);siz[x]=1;for(int i=0;i<int(a[x].size());i++){int u=a[x][i];if(u==fa)continue;prepare(u,x);  siz[x]+=siz[u];if(son[x]==0||siz[son[x]]<siz[u])son[x]=u;}
}
int tpd[MAXN];
int rk[MAXN],faz[MAXN],dep[MAXN];
void build_tree(int x,int tpx,int fa=0){tpd[x]=tpx;faz[x]=fa;dfn[x]=++cnt;dep[x]=dep[fa]+1;rk[cnt]=x;if(son[x]){build_tree(son[x],tpx,x);for(int i=0;i<int(a[x].size());i++){int u=a[x][i];if(u==fa||u==son[x])continue;build_tree(u,u,x);}}
}
int tree[MAXN*4];
void build(int id,int l,int r){if(l==r){if(rk[l]<=n)tree[id]=w[rk[l]];elsetree[id]=*val[rk[l]].begin();return ;}int mid=(l+r)>>1;build(id<<1,l,mid);build(id<<1|1,mid+1,r);tree[id]=min(tree[id<<1],tree[id<<1|1]);
}
void update(int id,int l,int r,int pos){if(l==r){if(rk[l]<=n)tree[id]=w[rk[l]];elsetree[id]=*val[rk[l]].begin();return ;}int mid=(l+r)>>1;if(pos<=mid)update(id<<1,l,mid,pos);elseupdate(id<<1|1,mid+1,r,pos);tree[id]=min(tree[id<<1],tree[id<<1|1]);
}
int ask(int id,int l,int r,int pl,int pr){if(l>=pl&&r<=pr)return tree[id];int mid=(l+r)>>1;int res=INF;if(pl<=mid)res=ask(id<<1,l,mid,pl,pr);if(pr>mid)res=min(res,ask(id<<1|1,mid+1,r,pl,pr));return res;
}
pii query(int u,int v){if(dep[tpd[u]]<dep[tpd[v]]||(dep[tpd[u]]==dep[tpd[v]]&&dep[u]<dep[v]))swap(u,v);if(tpd[u]==tpd[v])return make_pair(ask(1,1,n2,dfn[v],dfn[u]),v);pii res=query(faz[tpd[u]],v);res.first=min(res.first,ask(1,1,n2,dfn[tpd[u]],dfn[u]));return res;
}
char s[20];
int main(){int m,q,u,v;SF("%d%d%d",&n,&m,&q);for(int i=1;i<=n;i++)SF("%d",&w[i]);for(int i=1;i<=m;i++){SF("%d%d",&u,&v);a[u].push_back(v);a[v].push_back(u);}n2=n;dfs(1);for(int i=1;i<=n;i++)a[i].clear();for(int i=1;i<=tot;i++){//      PF("[%d %d]\n",Edge[i].u,Edge[i].v);a[Edge[i].u].push_back(Edge[i].v);a[Edge[i].v].push_back(Edge[i].u);}prepare(1);cnt=0;build_tree(1,1);build(1,1,n2);for(int i=1;i<=q;i++){SF("%s",&s);  if(s[0]=='A'){SF("%d%d",&u,&v);pii res=query(u,v);int x=res.second;int ans=res.first;if(x>n)ans=min(ans,w[faz[x]]);PF("%d\n",ans);}else{SF("%d%d",&u,&v);if(faz[u]>n){val[faz[u]].erase(val[faz[u]].find(w[u]));w[u]=v;val[faz[u]].insert(w[u]);update(1,1,n2,dfn[faz[u]]);}w[u]=v;update(1,1,n2,dfn[u]);}}
}

【圆方树】CodeForces487E Tourists相关推荐

  1. 【学习笔记】圆方树(CF487E Tourists)

    终于学了圆方树啦~\(≧▽≦)/~ 感谢y_immortal学长的博客和帮助 把他的博客挂在这里~ 点我传送到巨佬的博客QwQ! 首先我们来介绍一下圆方树能干什么呢qwq 1.将图上问题简化到树上问题 ...

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

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

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

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

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

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

  5. 圆方树学习记录及例题

    对于一个无向连通图,我们可以通过一些操作使其变成一棵树,然后再在树上操作 这颗树就叫圆方树,具体是怎么样的呢?看下图 这是一个无向连通图 然后找到每一个点双连通分量,并在这个点双里新建一个节点,并且是 ...

  6. 【蒟蒻の笔记】圆方树初识

    圆方树 首先描述一下圆方树: 注:我们把一条边连接两个节点的图也认为是点双连通的. 对于一个无向连通图,对于每个点双连通分量建立一个新的点,新的点作为"方点",原本的点作为&quo ...

  7. [APIO2018] Duathlon 铁人两项 圆方树,DP

    [APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...

  8. LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)

    题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两 ...

  9. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  10. [学习笔记]圆方树广义圆方树

    引入 偶尔,我们会遇到一些要在无向图/仙人掌上做的问题,这些问题如果在树上就会比较方便,那么我们就开始考虑能不能把原图等效成一棵树,然后就可以方便地乱搞了? 圆方树就是一种将无向图/仙人掌变成树的数据 ...

最新文章

  1. Java链接MySQL练习题:格式化日期、性别;避免代码注入
  2. 小鹏汽车9月总交付10412台 成为新造车势力中第一家月交付过万的企业
  3. SqlServer 分页批按时间排序
  4. Cisco职业认证再认证体系及程序问答
  5. 《Java从入门到放弃》JavaSE入门篇:JDBC(入门版)
  6. 指数退避和AIMD为什么都青睐数字2
  7. 卡方检验,U检验,t检验,F检验
  8. 一步成高手:终极图解内存(上篇)
  9. 宇枫资本投资理财这些要注意
  10. java 之DelayQueue实际运用示例
  11. 17.安全点与安全区
  12. 全球与中国云浏览器隔离市场深度研究分析报告
  13. 计算机系统保护怎么打开,Win7系统开启DEP数据执行保护的具体方法
  14. 两个实打实干活的同事离职了,老板连谈都没谈,一句挽留都没有,你怎么看?
  15. 深入理解计算机系统bomb炸弹实验
  16. ThinkPHP(1)——创建ThinkPHP项目
  17. 商汤科技20年秋招智慧城市-数据运营工程师笔试题(2019.8.19)
  18. repo forall
  19. urx驱动ur3和onrobot rg2
  20. KU115 PCIE总线数据预处理板卡(多LVDS接口)

热门文章

  1. 1807521-02-3,PEP azide,PEP叠氮化物其中叠氮基发生点击反应
  2. Driver error 11
  3. 严重: Unable to set localhost. This prevents creation of a GUID. Cause was: springtest: springtest
  4. 人类的行为与程序计算
  5. Win10将用户名修改为英文
  6. 基于单片机的水壶自动加热系统_一种基于单片机的电热水壶控制系统的制作方法...
  7. We never been grown up
  8. 试玩网站搭建讲解入门篇
  9. 记一次失败的小米前端面试经历
  10. 怎么追学计算机的女生,怎样去追比较文静,不爱说话的女生!!!!!