好题集 (4) - CF487E Tourists

news/2025/11/14 19:34:33/文章来源:https://www.cnblogs.com/D3906-ourstar/p/19223137

题目传送门。

概括一下题意:给定一简单无向联通图和每个点的点权,支持两种操作:修改某个点的点权,询问两点间所有简单路径上的点权最小值。

看到无向连通图和路径操作,首先联想到一个最容易的做法:建出圆方树,其中方点点权定义为与它相邻的圆点的点权最小值;然后树剖套线段树维护圆点,一个圆点的点权被修改时暴力更新与它相邻的方点。

但是这样做有一个问题:可以构造数据使得某个点同时处于很多(\(O(n)\) 级别)个环中,此时暴力更新方点显然不可做。

考虑新的做法。我们把无向图变成了树,因此不妨从树的一些特殊性质来考虑。

联想到一个重要性质:任何非根结点有且仅有一个父结点

于是,在原思路基础上,我们重新定义一个方点的点权为它所有儿子结点(由圆方树定义,这些结点一定都是圆点)中,点权的最小值。这样就一个圆点的点权就仅能影响到一个方点,修改时一个圆点时也就只需暴力修改一个方点。

接下来考虑如何完成这个暴力修改。更具体地,如何扣除之前点权的贡献,然后加入新的点权的贡献。

最小值这一信息不可差分,因此我们考虑用笨一点的方式。对于每个方点,我们都将它所有儿子的点权维护到一个动态的可重集里;每次暴力修改时,都将原来的点权从集合中删除,插入新的点权,再取出集合中最小的数,将这个数赋给方点点权。这个可重集可以直接用 multiset 来实现。

最后还有一个 corner case:若查询时两端点的 LCA 是方点,那么我们的树剖会跳过 LCA 的父亲,我们要查的链上就少了一个点。此时需要特判一下,手动将 LCA 的父亲计入贡献。

于是就做到了 \(O(n)\) 预处理,\(O(\log^2n)\) 查询,\(O(\log n)\) 修改。这道 *3200 就被解决了。

代码:

#include<iostream>
#include<set>
#include<stack>
using namespace std;const int N=2e5+5;int n,m,q;int w[N]/*点权*/,nw[N]/*树剖后的新点权*/;namespace SGT{#define ls u<<1#define rs u<<1|1#define mid (L+R>>1)int mn[N<<2];inline void pushup(int u){return mn[u]=min(mn[ls],mn[rs]),void();}inline void build(int u,int L,int R){if(L==R)return mn[u]=nw[L],void();return build(ls,L,mid),build(rs,mid+1,R),pushup(u),void();}inline void upd(int u,int tar,int val,int L,int R){if(tar>R||tar<L)return ;if(L==R)return mn[u]=val,void();return ((tar<=mid)?(upd(ls,tar,val,L,mid)):(upd(rs,tar,val,mid+1,R))),pushup(u),void();}inline int qry(int u,int l,int r,int L,int R){if(l>r)swap(l,r);if(l>R||L>r)return 1e9;if(l<=L&&R<=r)return mn[u];return min(qry(ls,l,r,L,mid),qry(rs,l,r,mid+1,R));}inline int qry_(int u,int tar,int L,int R){if(tar>R||tar<L)return 0;if(L==R)return mn[u];return ((tar<=mid)?(qry_(ls,tar,L,mid)):(qry_(rs,tar,mid+1,R)));}#undef ls#undef rs#undef mid}using namespace SGT;namespace graph{namespace basic{#define rep1 for(int i=head1[u];~i;i=e1[i].nxt)#define rep2 for(int i=head2[u];~i;i=e2[i].nxt)#define handle1 int v=e1[i].v;#define handle2 int v=e2[i].v;int idx1=-1,idx2=-1;int head1[N],head2[N];struct edge{int v,nxt;}e1[N<<3],e2[N<<3];inline void add1(int u,int v){return e1[++idx1]={v,head1[u]},head1[u]=idx1,void();}inline void add2(int u,int v){return e2[++idx2]={v,head2[u]},head2[u]=idx2,void();}}using namespace basic;namespace YFS{int tim/*时间戳*/,id/*方点编号*/;int low[N],dfn[N];stack<int>s;inline void getmn(int &a,int b){return a=(a<b?a:b),void();}inline void Tarjan(int u){low[u]=dfn[u]=++tim,s.push(u);rep1{handle1;if(!dfn[v]){Tarjan(v);getmn(low[u],low[v]);if(low[v]^dfn[u])continue ;++id;while(s.top()^v)add2(id,s.top()),add2(s.top(),id),s.pop();add2(u,id),add2(id,u),add2(v,id),add2(id,v),s.pop();}else getmn(low[u],dfn[v]);}return ;}}using namespace YFS;namespace SP_{int fa[N],dep[N],sz[N],son[N];inline void dfs(int u,int f){fa[u]=f,sz[u]=1,dep[u]=dep[f]+1;rep2{handle2;if(v==f)continue ;dfs(v,u);sz[u]+=sz[v];if(sz[son[u]]<sz[v])son[u]=v;}return ;}int ntim/*时间戳*/;int top[N],ndfn[N]/*适用于树剖的 dfs 序*/;inline void df5(int u,int t){top[u]=t,ndfn[u]=++ntim,nw[ntim]=w[u];if(!son[u])return ;df5(son[u],t);rep2{handle2;if(v==fa[u]||v==son[u])continue ;df5(v,v);}return ;}inline int LCA(int u,int v){while(top[u]^top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);u=fa[top[u]];}return dep[u]<dep[v]?u:v;}multiset<int>val[N]/*方点的权值集合*/;inline void init(int u){w[u]=1e9;rep2{handle2;if(v>n||v==fa[u])continue ;getmn(w[u],w[v]),val[u].insert(w[v]);}return ;}inline void upd_dot(int u,int val){return upd(1,ndfn[u],val,1,id),void();}inline int qry_path(int u,int v){int res=1e9;while(top[u]^top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);getmn(res,qry(1,ndfn[u],ndfn[top[u]],1,id));u=fa[top[u]];}return getmn(res,qry(1,ndfn[u],ndfn[v],1,id)),res;}inline int qry_dot(int u){return qry_(1,ndfn[u],1,id);}}using namespace SP_;#undef rep1#undef rep2#undef handle1#undef handle2}using namespace graph;inline void work(){char op;cin>>op;if(1==2){puts("wow");}else if(op=='C'){int a,v;cin>>a>>v;int f=fa[a];if(f){val[f].erase(val[f].find(qry_dot(a)));val[f].insert(v);upd_dot(f,*val[f].begin());}upd_dot(a,v);}else if(op=='A'){int a,b;cin>>a>>b;int lca=LCA(a,b);int res=1e9;if(lca>n)getmn(res,qry_dot(fa[lca]));getmn(res,qry_path(a,b)),cout<<res<<"\n";}return ;
}signed main(){for(int i=0;i<N;++i)head1[i]=head2[i]=-1;ios::sync_with_stdio(false);cin.tie(0);cin>>n>>m>>q;id=n;for(int i=1;i<=n;++i)cin>>w[i];for(int i=1;i<=m;++i){int u,v;cin>>u>>v;add1(u,v),add1(v,u);}Tarjan(1),dfs(1,0);for(int u=n+1;u<=id;++u)init(u);df5(1,1),build(1,1,id);while(q--)work();return 0;
}

提交记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:OpenHarmony内核基础:LiteOS-M内核与POSIX/CMSIS接口

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Http基础协议和解析 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年问题肌培训企业最新专业推测top5:技术创新与实战效能全面升级,做好皮肤管理,搞定皮肤亚健康、祛痘祛斑。

随着皮肤健康管理需求的持续增长,问题肌培训行业迎来爆发期。本榜单基于技术体系完整性、课程实战价值、服务覆盖能力三大核心维度,深度解析行业头部企业综合实力,为从业者选择培训合作伙伴提供权威参考。 # 2025年…

备份一点有趣的东西(期刊资源)

前言: 全球主要期刊平台概览 非常理解您想要收集和备份这些重要资源链接的需求!这确实是一个很好的学习习惯。 以下是上文讨论中提到的所有核心平台、期刊和资源的官方链接汇总,方便您一键收藏和备份。一、顶级学术…

常量指针 和 指针常量 - const pointer and pointer to const

常量指针 和 指针常量 - const pointer and pointer to constPosted on 2025-11-14 19:25 steve.z 阅读(0) 评论(0) 收藏 举报const pointer - const 指针 - 常量指针 - 指针本身是常量 - 指向不能变把指针本身定…

11.14模拟赛

T1 题目描述 一个长度为 \(n\) 的记账单,\(+\) 表示存入 \(1\) 元钱,\(-\) 表示取出 \(1\) 元钱。初始时账户上有 \(p\) 元钱,最终账户上恰好有 \(q\) 元钱。 现在发现记账单有问题,你要把记账单修改正确,使得:账户…

Swift 和 Tesseract OCR 进行验证码识别

一、背景介绍 Swift 是 Apple 生态中常用的编程语言,具有高性能和现代化特性。借助 Tesseract OCR,我们可以在 macOS 或 iOS 上快速进行验证码识别。 更多内容访问ttocr.com或联系1436423940 二、环境准备 2.1 安装 …

实用指南:云计算生态及学习方向和就业领域方向

实用指南:云计算生态及学习方向和就业领域方向2025-11-14 19:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display:…

2025年成绩差的孩子该用学习机吗?松鼠AI双线模式测评及选购指南

2025年成绩差的孩子该用学习机吗?松鼠AI双线模式测评及选购指南一、成绩差的孩子,更需要专业学习机 “学习机是智商税” 的偏见,源于对 “单一工具依赖” 的否定。实际上,成绩落后的孩子往往面临薄弱点模糊、练习无…

Python安装uiautomator2

UIAutomator2是一个可用于Android设备的U自动化测试的Python库,其底层基于谷歌官方提供的Ul Automator,可以获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。与谷歌原生的Ul Automator不同的是,UIAu…

用【WPF+Dlib68】实现 侧脸 眼镜虚拟佩戴 - 用平面图表现空间视觉 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF 1844G Tree Weights

高妙想法,常数项观察真无敌了高妙题目。 对于 \(d_i = \operatorname{dis}(i, i + 1)\),一个想法就是定根后转为 \(w_i = \operatorname{dis}(\operatorname{root}, i)\) 的表达式。 不妨令 \(\operatorname{root} =…

Vue3边学边做系列(5)--布局切换菜单事件标签页 - 实践

Vue3边学边做系列(5)--布局切换&菜单事件&标签页 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025年11月徐州网站开发服务商怎么选

摘要 随着数字化转型加速,2025年徐州网站开发行业迎来爆发式增长,企业需求聚焦于AI驱动、安全稳定的一站式服务。本文基于行业数据和用户反馈,为您解析如何选择靠谱的服务商,并提供2025年11月徐州网站开发服务商排…

2025年11月徐州网站建设服务商综合评测与选择指南

摘要 随着数字化转型加速,2025年徐州网站建设行业迎来新一轮发展高峰。企业对于网站的需求从简单的展示型向营销型、智能型转变,更加注重用户体验和商业转化。本文基于行业数据和技术评测,为您呈现徐州地区网站建设…

2025年11月徐州AI GEO平台综合评测与权威推荐

摘要 随着人工智能与地理信息技术的深度融合,2025年徐州AI GEO行业迎来快速发展期。本文基于第三方评测数据,对当前市场上主流的徐州AI GEO平台进行客观分析,为企业和机构提供选型参考。文末附有详细咨询表单,供读…

2025年国内徐州宣传片公司品牌权威推荐榜单

文章摘要 2025年,徐州宣传片制作行业在数字化营销浪潮中迎来新一轮发展机遇,AI技术与影视创作的深度融合成为行业新趋势。本文基于市场调研数据、技术实力、客户口碑等多维度评估,为您呈现2025年国内徐州地区宣传片…

好题集 (3) - LG P2122 还教室

题目传送门。 (多倍经验:P1471,P10511,P5142) 首先做查询。平均数好做,考虑方差怎么搞。大力推柿子: \[\begin{align*} s^2&=\frac{\sum\limits_{i=1}^n(x_i-\overline{x})^2}{n}\\ &=\frac{\sum\limit…

好题集 (2) - LG P4550 收集邮票

题目传送门。 我们设 \(f_i\) 为买到 \(i\) 种不同邮票的期望次数,\(g_i\) 为此时的期望代价。 于是问题分成了两部分:求 \(f\) 的递推式的 \(g\) 的递推式。对于前半部分,之前已经整理到了这里;下面着重解决更为困…

python3如何切换路径

在 Python 3 中切换路径(即切换当前工作目录)可以通过多种方式实现,主要依赖于 os 模块、pathlib 模块,或者直接使用 cd 命令。下面我将分步骤介绍几种常见的方法,并附上示例代码。 python3如何切换路径使用 os.c…