这是一个比较套路的题。
首先不能经过同一个点,很容易想到点双。
那么我们考虑构建圆方树。每一个圆点存放这个点的点权,方点存放点双中的最小点权。
然后树剖,线段树维护区间最小值即可并支持单点修改。
但是3200的题毕竟没有这么简单。我们发现,如果是一个中心点外面套了很多点双就会被卡成O(n2logn)O(n^2logn)O(n2logn)的。
所以可以发现,每一次修改值考虑修改父亲的那个方点就行了,其中如果lca是方点需要特殊处理。
code:

/*
{By GWj
*/
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define R(a) cin>>a
#define R2(a,b) cin>>a>>b
#define check_min(a,b) a=min(a,b)
#define check_max(a,b) a=max(a,b)
#define wtf cout<<'!'<<endl
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
/*}
*/
int n,low[200000+1],m,fa[200000+1][19],dfn[200000+1],siz[200000+1],top[200000+1],heavy[200000+1],cnt,depth[200000+1];
vector<int> g[200000+1],g2[200000+1];
bool vis[200000+10];
stack<int> st;
void dfs(int now,int pre=0,int deep=1){low[now]=depth[now]=deep;vis[now]=1;st.push(now); for(auto it:g[now]){if(it==pre) continue;if(vis[it]){check_min(low[now],depth[it]);}else{dfs(it,now,deep+1);check_min(low[now],low[it]);if(low[it]>=depth[now]){int is;++cnt;do{is=st.top();st.pop();g2[cnt].PB(is);g2[is].PB(cnt);}while(is!=it);g2[now].PB(cnt);g2[cnt].PB(now);}}}
}
void dfs3(int now,int pre=0,int deep=1){depth[now]=deep+1;fa[now][0]=pre;rb(i,1,18)fa[now][i]=fa[fa[now][i-1]][i-1];for(auto it:g2[now]){if(it!=pre){dfs3(it,now,deep+1);}}
}
int lca(int u,int v){if(depth[u]>depth[v]) swap(u,v);int jump=depth[v]-depth[u];rep(i,19){if((jump>>i)&1){v=fa[v][i];}}if(u==v) return v;rl(i,18,0){if(fa[u][i]!=fa[v][i]){u=fa[u][i];v=fa[v][i];}}return fa[u][0];
}
priority_queue<mp,vector<mp>,greater<mp> > qu[200000+1];
void dfs4(int now,int pre=0){siz[now]=1;for(auto it:g2[now]){if(it==pre) continue;dfs4(it,now);siz[now]+=siz[it];}for(auto it:g2[now]){if(it==pre) continue;if(siz[it]*2>=siz[now]){heavy[now]=it;}}
}
void dfs2(int now,int pre=0){dfn[now]=++cnt;if(heavy[now]){top[heavy[now]]=top[now];dfs2(heavy[now],now);}for(auto it:g2[now]){if(it==pre) continue;if(it==heavy[now]) continue;top[it]=it;dfs2(it,now);}
}
const int N=1<<18;
int tree[N<<1];
void modify(int index,int val){index+=N-1;tree[index]=val;index>>=1;while(index){tree[index]=min(tree[index<<1],tree[index<<1|1]);index>>=1;}
}
int query(int a,int b,int now,int l=1,int r=N+1){if(r<=a||l>=b){return INF;}if(r<=b&&l>=a){return tree[now];}int mid=(l+r)>>1;return min(query(a,b,now<<1,l,mid),query(a,b,now<<1|1,mid,r));
}
int query(int u,int v){if(v>n){v=fa[v][0];}assert(v<=n);assert(depth[u]>=depth[v]);int rest=INF;while(depth[u]>=depth[v]&&u){int is;if(depth[top[u]]<depth[v]){is=v;}else{is=top[u];}rest=min(rest,query(dfn[is],dfn[u]+1,1));  u=fa[is][0];}return rest;
}
int w[100000+1];
int main(){fastio;R2(n,m);cnt=n;int q;R(q);rb(i,1,n){R(w[i]);}rb(i,1,m){int u,v;R2(u,v);g[u].PB(v);g[v].PB(u); }              dfs(1);
//  cout<<endl;
//  rb(i,1,cnt){//      for(auto it:g2[i]){//          if(it>i){//              cout<<i<<" "<<it<<endl;
//          }
//      }
//  }
//  return 0;dfs3(1);dfs4(1);cnt=0;top[1]=1;dfs2(1);rb(i,1,n){if(fa[i][0]>n){qu[fa[i][0]].push(II(w[i],i));}modify(dfn[i],w[i]);} rb(i,n+1,cnt){modify(dfn[i],qu[i].top().FIR);}rb(i,1,q){char ty;R(ty);if(ty=='C'){int a,w_;R2(a,w_);w[a]=w_;if(fa[a][0]>n){qu[fa[a][0]].push(II(w[a],a));while(1){int val,id;val=qu[fa[a][0]].top().FIR;id=qu[fa[a][0]].top().SEC;if(w[id]!=val){qu[fa[a][0]].pop();}else{break;}}modify(dfn[fa[a][0]],qu[fa[a][0]].top().FIR);}modify(dfn[a],w_);}else{int a,b;R2(a,b);int llc=lca(a,b);cout<<min(query(a,llc),query(b,llc))<<endl; }}return 0;
}

cf487e Tourists 题解(圆方树)相关推荐

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

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

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

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

  3. Codeforces 1045C Hyperspace Highways (看题解) 圆方树

    学了一下圆方树, 好神奇的东西呀. #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...

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

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

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

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

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

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

  7. 仙人掌圆方树学习笔记

    终于对仙人掌有了一点初步的理解. 仙人掌 仙人掌是什么? 仙人掌是一个无向图. 仙人掌有什么特点? 仙人掌的每条边只属于一个简单环. 下面是一个栗子 有什么用呢? 我们可以先用\(tarjan\)找出 ...

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

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

  9. 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】

    题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...

  10. [XSY] 绿色(圆方树、树形DP、树上差分)

    绿色 题意简述 题解 首先,每次修改完点权后,重新考虑一遍所有路径显然是不现实的,所以我们考虑求出经过每个点的两端同色的简单路径数,这样权值和容易统计和修改. 接下来分析仙人掌上的简单路径性质.一条简 ...

最新文章

  1. 【Android 应用开发】Activity 返回堆栈管理 ( 栈内复用模式 singleTask | 单实例模式 singleInstance )
  2. 实用ExtJS教程100例-006:ExtJS中Window的用法示例
  3. Linux有关Shell算数运算的用法补充笔记
  4. 中审咨询政府行业远程接入解决方案
  5. php中usc2编码,规则编码说明
  6. sqlserver无ldf日志文件附加的方法(数据库没有完全关闭,无法重新生成日志)...
  7. MySQL 联合查询
  8. 搭建Wpf框架(1) —— 管理系统-Wpf客户端框架2.0(OA,聊天,定时任务)
  9. WinRAR 5.60 无广告正式版
  10. 新网站链接提交入口攻略
  11. 电脑怎么找回被删除的文件?
  12. 本周开课 | 10年运营专家亲授,掌握9类运营的核心技能,强化运营实力
  13. 三星云服务S Cloud亮相 与苹果iCloud为敌
  14. 【情报工具】分享15款保护隐私的搜索引擎
  15. js循环绑定事件问题及解决方法
  16. sherwood算法
  17. Android 多语言支持
  18. 巨龙之巢服务器为响应,LOL巨龙之巢新网通大区9月4日开放 龙女皇子潘森免费用...
  19. 惠普服务器cpu芯片,惠普、戴尔推出ARM服务器_Intel服务器CPU_服务器产业-中关村在线...
  20. Power BI—导出数据

热门文章

  1. 阳谷机器人编程_阳谷实验幼儿园绘本故事《机器人阿泰》
  2. 真•神器:Desmos 心形曲线x4
  3. 觉醒:游戏迷学了计算机
  4. 2.6.2 QDate类与QDateEdit控件介绍(日期处理)
  5. c语言-蓝桥杯-门牌制作问题
  6. 人可以活得更用力一些
  7. 云大计算机专业基础综合,2020云南大学计算机专业课改考408
  8. 百度地图经纬度距离计算
  9. eNSP和HCL兼容共存问题
  10. 鸿蒙使用体验 2.0,鸿蒙的到来与华为的破局