题意:给一张 nnn 点 mmm 边的连通无向图,点帯权,qqq 次操作:

  1. 修改一个点的权值。
  2. 询问两点间所有简单路的最小权值的最小值。

n,m,q≤105n,m,q\leq 10^5n,m,q≤105

显然建出圆方树然后询问路径最小值。多半要树链剖分了。

对于方点,其权值为所有相邻的圆点的权值的最小值。

由于圆点权值会修改,所以需要用 multiset 来维护方点权值。

然而圆点可能在多个点双中,修改时不能暴力更新。

所以可以直接根号分治艹过去

分析圆方树的性质,发现方点相邻的圆点只有一个是父结点废话

对每个方点只维护所有儿子的multiset,修改圆点的时候只改父亲,然后询问的时候如果 lca 是方点就手动加上父结点。

这么显然的东西自己就是想不到,好难受啊……

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <algorithm>
#include <set>
#define MAXN 200005
#define MAXM 200005
using namespace std;
const int INF=2e9;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline char gal()
{char c=getchar();while (!isalpha(c)) c=getchar();return c;
}
struct edge{int u,v;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt=1;
inline void addnode(int u,int v)
{e[++cnt]=(edge){u,v};nxt[cnt]=head[u];head[u]=cnt;
}
int val[MAXN],n,m,q;
int dfn[MAXN],low[MAXN],tim;
int stk[MAXM],tp,vis[MAXM],bcc[MAXM],vcnt;
vector<int> rtt[MAXN];
void tarjan(int u)
{dfn[u]=low[u]=++tim;for (int i=head[u];i;i=nxt[i]){if (!vis[i>>1]&&!bcc[i>>1]) vis[(stk[++tp]=i)>>1]=1;if (!dfn[e[i].v]){tarjan(e[i].v);low[u]=min(low[u],low[e[i].v]);if (dfn[u]==low[e[i].v]){rtt[u].push_back(bcc[i>>1]=++vcnt);rtt[bcc[i>>1]].push_back(u);while (vis[i>>1]){int t=stk[tp--];vis[t>>1]=0;rtt[bcc[t>>1]=vcnt].push_back(e[t].v);}}}else low[u]=min(low[u],dfn[e[i].v]);}
}
multiset<int> s[MAXN];
#define e rtt
namespace RTT
{int dep[MAXN],siz[MAXN],fa[MAXN],son[MAXN];void dfs(int u){siz[u]=1;for (int i=0;i<(int)e[u].size();i++)if (!dep[e[u][i]]){fa[e[u][i]]=u,dep[e[u][i]]=dep[u]+1;dfs(e[u][i]);siz[u]+=siz[e[u][i]];if (siz[e[u][i]]>siz[son[u]]) son[u]=e[u][i];}}int dfn[MAXN],lis[MAXN],tp[MAXN],tim;void dfs(int u,int f){lis[dfn[u]=++tim]=u;if (son[u]) tp[son[u]]=tp[u],dfs(son[u],u);for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=f&&e[u][i]!=son[u])dfs(tp[e[u][i]]=e[u][i],u);}#define lc p<<1#define rc p<<1|1int mn[MAXN<<2];inline void update(int p){mn[p]=min(mn[lc],mn[rc]);}void build(int p,int l,int r){if (l==r) return (void)(mn[p]=(lis[l]<=n? val[lis[l]]:*s[lis[l]].begin()));int mid=(l+r)>>1;build(lc,l,mid),build(rc,mid+1,r);update(p);}void modify(int p,int l,int r,int k){if (l==r) return (void)(mn[p]=(lis[l]<=n? val[lis[l]]:*s[lis[l]].begin()));int mid=(l+r)>>1;if (k<=mid) modify(lc,l,mid,k);else modify(rc,mid+1,r,k);update(p);}int query(int p,int l,int r,int ql,int qr){if (ql<=l&&r<=qr) return mn[p];if (qr<l||r<ql) return INF;int mid=(l+r)>>1;return min(query(lc,l,mid,ql,qr),query(rc,mid+1,r,ql,qr));}inline void modify(int x,int v){s[fa[x]].erase(s[fa[x]].find(val[x]));val[x]=v;modify(1,1,vcnt,dfn[x]);s[fa[x]].insert(v);modify(1,1,vcnt,dfn[fa[x]]);}inline int query(int x,int y){int ans=INF;while (tp[x]!=tp[y]){if (dep[tp[x]]<dep[tp[y]]) swap(x,y);ans=min(ans,query(1,1,vcnt,dfn[tp[x]],dfn[x]));x=fa[tp[x]];}if (dep[x]>dep[y]) swap(x,y);if (x>n) ans=min(ans,val[fa[x]]);return min(ans,query(1,1,vcnt,dfn[x],dfn[y]));}
}int main()
{n=read(),m=read(),q=read();for (int i=1;i<=n;i++) val[i]=read();for (int i=1;i<=m;i++){int u,v;u=read(),v=read();addnode(u,v),addnode(v,u);}vcnt=n;tarjan(1);for (int u=1;u<=vcnt;u++){sort(e[u].begin(),e[u].end());e[u].erase(unique(e[u].begin(),e[u].end()),e[u].end());   }RTT::dep[1]=1,RTT::dfs(1);RTT::tp[1]=1,RTT::dfs(1,0);for (int u=1;u<=n;u++) s[RTT::fa[u]].insert(val[u]);RTT::build(1,1,vcnt);    while (q--){char op=gal();if (op=='C'){int a,w;a=read(),w=read();RTT::modify(a,w);}else printf("%d\n",RTT::query(read(),read()));}return 0;
}

【CF487E】Tourists【圆方树】【树链剖分】【multiset】相关推荐

  1. CodeForces - 1437G Death DBMS(AC自动机fail树上树链剖分建线段树/暴跳fail)

    题目链接:点击查看 题目大意:给出 n 个模式串,每个模式串初始时的权值为 0,然后有 m 次操作: 1 i x:将第 i 个模式串的权值修改为 x 2 s:给出一个字符串 s,询问字符串 s 作为主 ...

  2. 个人赛C 柠檬树2--树链剖分+维护最值出现次数/LCA

    给一棵树,维护上面两点最短路径中结点的最大值及最大值出现次数 #include <stdio.h> #include<string.h> #include<algorit ...

  3. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  4. [十二省联考2019]春节十二响——长链剖分+堆

    题目链接: [十二省联考2019]春节十二响 可以发现每条链上的所有点都要放在不同的段里,那么最多只需要树的深度这么多段就够了. 因为这样可以保证每条链上的点可以放在不同的段中而且一个点放在这些段中一 ...

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

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

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

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

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

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

  8. 5909. 【NOIP2018模拟10.16】跑商(圆方树+树链剖分+SET)

    题目大意: 基三的地图可以看做 n 个城市,m 条边的无向图,尊者神高达会从任意一个点出发并在起点购买货物,在旅途中任意一点卖出并最终到达终点,尊者神高达的时间很宝贵,所以他不会重复经过同一个城市,但 ...

  9. [JZOJ5909]【NOIP2018模拟10.16】跑商【圆方树】【树链剖分】

    Description 基三的地图可以看做 n 个城市,m 条边的无向图,尊者神高达会从某个点出发并在起点购买货物,在旅途中任意一点卖出并最终到达终点,尊者神高达的时间很宝贵,所以他不会重复经过同一个 ...

最新文章

  1. POJ 1094 Sorting It All Out (拓扑排序)
  2. python100个必背知识-学Python必背的初级单词,你都背了吗?
  3. tomcat 修改默认字符集
  4. HBase thrift C++编程
  5. win10北通手柄没反应_《动物森友会》怎么玩出新花样?北通宙斯游戏手柄宏玩法了解下...
  6. C++ 11 深度学习(五)类型转换:static_cast dynamic_cast const_cast reinterpret_cast
  7. 0基础lua学习(二十)Lua单例
  8. dede设置当前栏目的样式
  9. WebFlux系列(十)WebClient 异常处理
  10. 模型加速:WAE-Learning a Wavelet-like Auto-Encoder to Accelerate Deep Neural Networks
  11. 使用kubectl访问Kubernetes集群时的身份验证和授权
  12. thinkcmf安装教程与目录结构详解 快速上手版
  13. android根据银行卡卡号判断银行
  14. 第一章:操作系统引论
  15. 获取 app 签名的方式汇总
  16. iOS开发之上传应用至APP store - 加急审核, 本人亲测苹果加速审核一年不止两次,只要理由充分,是可以多次的 。不过尽量避免
  17. 已知圆柱半径求周长c语言,求圆柱体积和周长的c语言编写程序
  18. Stone Ocean(https://acs.jxnu.edu.cn/problem/GYM103495E)
  19. Vijos——同学排序
  20. 整个链表的逆序实现及部分链表的逆序实现(C++)

热门文章

  1. 年仅53岁,因连续工作、过度劳累,这位抗疫幕后的科研专家去世
  2. 中国代工厂的困惑:把大牌t恤卖到99块3件,还会有人买吗?
  3. 还在用Excel做数据分析?两大方法5分钟完成别人一天的工作
  4. 《销售总监》读书笔记
  5. 信管专业c语言考什么,计算机信息管理专业卫生事业单位招聘考试笔试模拟题(十)...
  6. 行者运行脚本命令_行者脚本指令说明
  7. weblogic修改控制台ip_「Weblogic学习」Weblogic知识要点之JNDI/JTA编程开发
  8. linux yum自动挂载_LINUX6安装YUM仓库和实现开机自动挂载
  9. 计算机二级和英语四六级是同一个账号吗,英语四六级考试和计算机考试的登录账号和密码一样吗?我好像混了,但是密码一直输不对,...
  10. signature=fc89d4352b6699754c14ce282ec75426,Method for Assembly of Nucleic Acid Sequence Data