来自FallDream的博客,未经允许,请勿转载,谢谢。


给定一张无向图,有点权,要支持单点修改点权和询问从一个点到另一个点不重复经过节点的路径上点权最小值的最小值。

n,m<=10^5

考虑求出图的点双连通分量,然后每个点向所有包含他的点双连边,这样我们可以得到一棵树。

询问就变成了询问与树上两点间路径上的点相邻的点中权值的最小值。

我们考虑对每个点双开一个堆,把所有儿子的信息扔进去。这样但点修改只需要修改它父亲那个点双就行了。

然后用树剖+线段树来支持查询即可。注意特判lca的父亲节点。

复杂度O(nlog^2n)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#define P(x,y) make_pair(min(x,y),max(x,y))
#define pa pair<int,int>
#define MN 200000
#define N 262144
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
pa q[MN*+];map<pa,bool> mp;vector<int> v[MN+];priority_queue<pa,vector<pa>,greater<pa> > s[MN+];
int n,m,Q,tp=,b[MN+],head[MN+],dfn[MN+],low[MN+],mark[MN+],dn=,cnt=,size[MN+];
int fa[MN+],w[MN+],vis[MN+],num=,bel[MN+],dep[MN+],top[MN+],mx[MN+],T[N*+];
struct edge{int to,next;}e[MN*+];
inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
}
inline void Ins(int f,int t)
{
v[f].push_back(t);
v[t].push_back(f);
}
void Tarjan(int x,int fa)
{
dfn[x]=low[x]=++dn;int son=;
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
{
if(!dfn[e[i].to])
{
++son;
q[++tp]=make_pair(x,e[i].to),Tarjan(e[i].to,x);
low[x]=min(low[x],low[e[i].to]);
if(low[e[i].to]>=dfn[x])
{
b[x]=;++num;
while(q[tp+]!=make_pair(x,e[i].to))
{
int a=q[tp].first,b=q[tp].second;
if(bel[a]!=num) Ins(a,num+n);
if(bel[b]!=num) Ins(b,num+n);
--tp;bel[a]=num;bel[b]=num;
}
}
}
else
{
low[x]=min(low[x],dfn[e[i].to]);
if(dfn[x]>dfn[e[i].to]) q[++tp]=make_pair(x,e[i].to);
}
}
if(son==&&!fa) b[x]=;
}
void Pre(int x,int f)
{
fa[x]=f;size[x]=;mx[x]=;
for(int i=;i<v[x].size();++i)
if(v[x][i]!=f)
{
dep[v[x][i]]=dep[x]+;
Pre(v[x][i],x);
size[x]+=size[v[x][i]];
if(size[v[x][i]]>size[mx[x]]) mx[x]=v[x][i];
}
} void Dfs(int x,int Tp)
{
top[x]=Tp;dfn[x]=++dn;
if(mx[x]) Dfs(mx[x],Tp);
for(int i=;i<v[x].size();++i)
if(v[x][i]!=mx[x]&&v[x][i]!=fa[x])
Dfs(v[x][i],v[x][i]);
}
void Renew(int x,int k){for(T[x+=N]=k;x>>=;)T[x]=min(T[x<<],T[x<<|]);}
int Query(int l,int r)
{
int mx=1e9;
for(l+=N-,r+=N+;l^r^;l>>=,r>>=)
{
if(~l&) mx=min(mx,T[l+]);
if( r&) mx=min(mx,T[r-]);
}
return mx;
}
void Add(int x,int v,int k)
{
++vis[v];
s[x].push(make_pair(k,v));
while(!s[x].empty()&&w[s[x].top().second]!=s[x].top().first) s[x].pop();
int K=s[x].size()?s[x].top().first:;Renew(dfn[x],K);
}
int Solve(int x,int y)
{
int mx=1e9;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
mx=min(mx,Query(dfn[top[x]],dfn[x]));
x=fa[top[x]];
}
if(dfn[x]>dfn[y]) swap(x,y);
mx=min(mx,Query(dfn[x],dfn[y]));
if(x>n&&fa[x]) mx=min(mx,w[fa[x]]);
return mx;
}
char st[];
int main()
{
n=read();m=read();Q=read();
for(int i=;i<=n;++i) w[i]=read();
for(int i=;i<=m;++i) ins(read(),read());
Tarjan(,);memset(T,,sizeof(T));
dn=;Pre(,);Dfs(,);
for(int i=;i<=n;++i)
{
Renew(dfn[i],w[i]);
if(fa[i]) Add(fa[i],i,w[i]);
}
for(int i=;i<=Q;++i)
{
scanf("%s",st+);int x=read(),y=read();
if(st[]=='A') printf("%d\n",Solve(x,y));
else
{
w[x]=y,Renew(dfn[x],y);
if(fa[x]) Add(fa[x],x,y);
}
}
return ;
}

Codeforces278E Tourists的更多相关文章

  1. 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分

    E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...

  2. Tourists

    Tourists 时间限制: 5 Sec  内存限制: 64 MB 题目描述 In Tree City, there are n tourist attractions uniquely labele ...

  3. CF487 E. Tourists [点双连通分量 树链剖分 割点]

    E. Tourists 题意: 无向连通图 C a w: 表示 a 城市的纪念品售价变成 w. A a b: 表示有一个游客要从 a 城市到 b 城市,你要回答在所有他的旅行路径中最低售价的最低可能值 ...

  4. 【CF487E】Tourists(圆方树)

    [CF487E]Tourists(圆方树) 题面 UOJ 题解 首先我们不考虑修改,再来想想这道题目. 我们既然要求的是最小值,那么,在经过一个点双的时候,走的一定是具有较小权值的那一侧. 所以说,我 ...

  5. 每日英语:Foreign Tourists Skip Beijing

    Overseas tourists continued to shun Beijing through 2013. shun:避开,避免,回避 Amid rising pollution and a ...

  6. L192 Virgin Galactic Completes Test of Spaceship to Carry Tourists

    Virgin Galactic says its spacecraft designed to launch tourists into space completed an important te ...

  7. UOJ #30. [CF Round #278] Tourists

    UOJ #30. [CF Round #278] Tourists 题目大意 : 有一张 \(n\) 个点, \(m\) 条边的无向图,每一个点有一个点权 \(a_i\) ,你需要支持两种操作,第一种 ...

  8. [UOJ30]/[CF487E]Tourists

    [UOJ30]/[CF487E]Tourists 题目大意: 一个\(n(n\le10^5)\)个点\(m(m\le10^5)\)条边的无向图,每个点有点权.\(q(q\le10^5)\)次操作,操作 ...

  9. Tourists——圆方树

    CF487E Tourists 一般图,带修求所有简单路径代价. 简单路径,不能经过同一个点两次,那么每个V-DCC出去就不能再回来了. 所以可以圆方树,然后方点维护一下V-DCC内的最小值. 那么, ...

随机推荐

  1. ios中录音功能的实现AudioSession的使用

    这个星期我完成了一个具有基本录音和回放的功能,一开始也不知道从何入手,也查找了很多相关的资料.与此同时,我也学会了很多关于音频方面的东西,这也对后面的录音配置有一定的帮助.其中参照了<iPhon ...

  2. Struts2之Struts2的标签库

    前言: Struts2提供了大量的标签 ,用来帮助开发表现层页面,这些表现一方面解决了美观性的需求,因为它们具有html标签一样的外观,另一方面它们解决了功能性的需求, 因为它们具有jsp脚本一样的逻 ...

  3. bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...

  4. 学习less

    什么是less?LESSCSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法,为CSS的赋予了动态语言的特性,如变量.继承.运算.函数等,更方便CSS的编写和维护. less哪 ...

  5. Mego(06) - 关系数据库建模

    框架中提供了多种数据注释以便可以全面的描述数据库结构特性. 自增列 可以使用注释声明指定列是数据库自增列,同时能指定自增的起始及步长. public class Blog { [Identity(, ...

  6. Hadoop学习笔记一(HDFS架构)

    介绍 Hadoop分布式文件系统(HDFS)设计的运行环境是商用的硬件系统.他和现存的其他分布式文件系统存在很多相似点.不过HDFS和其他分布式文件系统的区别才是他的最大亮点,HDFS具有高容错的特性 ...

  7. PHP常用函数集合

    PHP常用函数总结 数学函数 1.abs(): 求绝对值 $abs = abs(-4.2); //4.2 数字绝对值数字 2.ceil(): 进一法取整 echo ceil(9.999); // 10 ...

  8. POJ1015 && UVA - 323 ~Jury Compromise(dp路径)

    In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting of ...

  9. 页面获取Web控件ID不能正常获取,它惹得祸

    今天碰到个比较奇葩的问题,因为动了一下目标框架,又原来的4.5.1改为3.5,然后又改回来了4.5.1,结果运行项目的时候发现界面js的计算,不能正常获值计算. 于是就开始找问题呗,先是发现这个二手项 ...

  10. AES(高级加密)

    AES(高级加密) #3.6安装 pip3 install pycryptodome #mac pip3 install pycrypto a. 事例: ####################### ...