CF589H Tourist Guide

昨晚码敲完了没保存,导致还原卡直接把我码肘没了。。。

气死了只能重新敲了一遍。

题面

Tourist Guide

分析

考虑每一个联通块分开处理。

先将每一个联通块变为生成树,任意生成方式皆可。

对于每一个联通块,一定可以构造一种组合方法,使得该联通块中最多只有一个关键点无法被选择。

并且每一个组合之间一定不会有重复的路径。因为如果有重复边,那么选择组合的时候就不会这么选了,如下图所示:

假设 $x_1$ 与 $y_1$ 是一对组合。

同时 $x_2$ 与 $y_2$ 组合与该组合有重复的部分。

那么选择的时候就会选择 $x_1$ 与 $x_2$ 作为一对组合, $y_1$ 与 $y_2$ 作为一对组合,即可避免这种重复的情况,如下图:

找出所有组合之后,暴力求生成树上两点的距离就好了,可惜作者是个小呆呆,写了树剖,还没用上。。。

时间复杂度 $O(n)$。

谷还是交不了 codeforce 的题,好不容易切了一道黑题,白切了。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{int nxt,to;
}edge[100010];
int head[100010],tot;
void add(int x,int y)
{edge[++tot].nxt=head[x];edge[tot].to=y;head[x]=tot;
}
int n,m,k;
int book[100010];//k 
int vis[100010];
int vis2[100010];
int dep[100010];
int size[100010];
int son[100010];
int top[100010];
int fa[100010];
pair<int,int>t[100010];
int cnt;
int dfs(int id,int f=0)
{int hys=book[id]?id:0;
//	cout<<id<<' '<<hys<<endl;fa[id]=f;dep[id]=dep[f]+1;vis[id]=1;size[id]=1;for(int i=head[id];i;i=edge[i].nxt){int to=edge[i].to;if(vis[to])continue;int xgd=dfs(to,id);size[id]+=size[to];if(xgd){if(hys){t[++cnt]=make_pair(xgd,hys);hys=0;}else hys=xgd;}if(son[id]==0||size[son[id]]<size[to]){son[id]=to;}}return hys;
}
void dfs2(int id,int topid)
{vis2[id]=1;top[id]=topid;if(son[id]){dfs2(son[id],topid);}for(int i=head[id];i;i=edge[i].nxt){int to=edge[i].to;if(!vis2[to]&&to!=son[id]){dfs2(to,to);}}
}
int ans[100010],ans2[1000010];
int l1,l2;
void lca(int x,int y)
{
//	cout<<x<<y<<endl;l1=0,l2=0;while(top[x]!=top[y]){
//		cout<<x<<y<<endl;if(dep[top[x]]>=dep[top[y]]){int e=fa[top[x]];for(;x!=e;x=fa[x])ans[++l1]=x;}else if(dep[top[x]]<dep[top[y]]){int e=fa[top[y]];for(;y!=e;y=fa[y])ans2[++l2]=y;	}}if(dep[x]>dep[y]){for(;x!=y;x=fa[x])ans[++l1]=x;		}else{for(;y!=x;y=fa[y])ans2[++l2]=y;		}ans[++l1]=x;printf("%lld ",l1+l2-1);for(int i=1;i<=l1;i++){printf("%lld ",ans[i]);}for(int i=l2;i>=1;i--){printf("%lld ",ans2[i]);}	putchar(10);
}
signed main()
{scanf("%lld%lld%lld",&n,&m,&k);for(int i=1;i<=m;i++){int u,v;scanf("%lld%lld",&u,&v);
//			cout<<"QWQ";add(u,v);
//			cout<<"QWQ";add(v,u);
//		cout<<"QWQ";}for(int i=1;i<=k;i++){int id;scanf("%lld",&id);book[id]=1;}for(int i=1;i<=n;i++){if(!vis[i]){int qwq=dfs(i);dfs2(i,i);}
//		cout<<dep[i];}printf("%lld\n",cnt);for(int i=1;i<=cnt;i++){int x=t[i].first,y=t[i].second;if(x>y)swap(x,y);lca(x,y);
//		cout<<x<<y<<endl;}return 0;
}

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

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

相关文章

2024新生赛-Week1

F12 快捷键f12直接查看字符串 xor 了解一下XOR运算,AB=C,CA=B 使用a数组对输入的字符进行循环运算取出最终的字符串再进行一次xor即可得到flag Ezencode进入加密函数后发现是一个base64算法,对表进行了替换,最后有对编码得到的结果进行异或操作. 提出最后的密文,进行异或,换表,…

DAY2-补题

我补题AK了,但你出言不逊是 非常好的一套题,让我的大脑旋转啊。 不太想开一个文章单独屑,所以扔到随笔里面。 敲字速度有待加强。 说在前面 题目难度单调递减,分数单调递减。果然屑死了。 T1再次读题失误,正确的来说是代码敲得非常抽象。T2DP但没骗到分非常不好,T3场上想…

独立站如何批量查收录,教你独立站如何批量查收录的方法操作步骤

独立站批量查收录是SEO优化工作中的重要环节,有助于网站管理员或SEO人员及时了解网站在搜索引擎中的表现,从而制定针对性的优化策略。以下是一些常用的独立站批量查收录的方法及其操作步骤: 一、使用搜索引擎的Site指令结合自动化脚本 编写脚本或配置爬虫: 利用Python、She…

04-论说文:审题与立意(1)

命题作文 比较开放 近义词 相关性 竞争 合作 竞争合作 ==》 竞争合作的关系 概率==》风险 风险 利益 审题 较难

pycharm 拆分窗口, 取消分屏; VS code 分屏

Split Vertically 或者 Split Horizontally 可以把当前编辑窗口垂直或者水平拆分成两个。 Split Vertically或者Split Horizontally可以把当前编辑窗口垂直或者水平拆分成两个。 取消拆分窗口: VS code 分屏:

南沙C++信奥赛陈老师解一本通题 1966:【14NOIP普及组】比例简化

​【题目描述】在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有 1498 人,反对的有 902 人,那么赞同与反对的比例可以简单的记为1498:902。 不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例…

pycharm 拆分窗口 pycharm怎么分屏,取消分屏

Split Vertically 或者 Split Horizontally 可以把当前编辑窗口垂直或者水平拆分成两个。 Split Vertically或者Split Horizontally可以把当前编辑窗口垂直或者水平拆分成两个。 取消拆分窗口:

三维激光扫描技术在文保修缮项目中的应用

三维激光扫描技术作为一种新兴的高精度空间数据获取手段,其在文物保护和修缮项目中的应用日益广泛。这项技术通过快速获取物体表面的三维密集点云数据,为文物的数字化存档、保护、修复及再利用提供了强有力的技术支持。 数据采集:高精度与非接触性三维激光扫描技术通过激光测…

土地规划与区域经济发展:筑基均衡未来的战略经纬

在新时代背景下,土地规划不仅是空间布局的艺术,更是推动区域经济均衡发展的关键引擎。土地资源的合理配置对于激发区域潜能、促进经济结构优化有着重要意义。本文将深入剖析土地规划如何成为促进区域经济均衡发展的强大动力。一、土地规划与区域经济的内在联系土地是经济社会…

【api安全】发展趋势与防护方案

原创 让数据更安全 德斯克安全小课堂近期, 全球知名IT咨询和调研机构Gartner 在 API 安全方面的两位分析师Mark ONeill和Dionisio Zumerle,合作举办了一场主题为“如何保护API免受攻击和数据泄露”的网络研讨会。这次会议分享的内容,对于正在探寻API安全保护方案的安全人员来…

找到一个数最接近的比它大的2的n次幂的代码分析

pub fn f1(mut n: u32) -> u32 {n = n | (n >> 1);n = n | (n >> 2);n = n | (n >> 4);n = n | (n >> 8);n = n | (n >> 16);n }如果n的输入类型为 u32(32位无符号整型), 上述代码的结果为大于等于n的2^k - 1的值(因为可能会出现溢出,所…

《如 何 速 通 一 套 题》8.0

邮寄 开场秒 B。 A 稍微退了一会儿,推出一个解法(后面发现假掉了)...... 然后 CD,D 感觉是一个 SA。结果 SA 写错了,算法假掉了...... A 智乃的差分 分类讨论。 \(x > 0\) 最大值 \(= x\),最小值 \(= 0\) 此时可以直接找一个不是 \(x\),不是 \(0\) 的数来(严格次小值…