尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CF1254E

CF1254E
📅 发布时间:2026/7/30 0:19:25

很想许多 agc 那种观察充要条件然后简单计数的题目,然后记录一下我的思考过程。

考虑找一些必要条件。首先每条边操作后,相当于 “独立” 两个部分,于是可以考虑将 \(i \to a_i\) 这条链上的边 \(+1\),显然每条边的每个方向各被覆盖一次。这显然不充分,因为有 \(a_i=i\) 就错了,于是加一个 \(a_i=i\) 的条件?发现也不充分,于是可以考虑 \(fa_i=(0,1,2,3,2,5),a_i=(2,1,6,3,4,5)\)。

这里有个对于仅加入 \(a_i \not=i\) 的伪证:考虑从叶子出发,找到第一个 \(i\) 往下指的点,将其与儿子交换。但是为什么不对?因为交换 \((u,v)\) 后可能出现 \(a_u=v/a_v=u\),但是我们发现当 \((a_1,a_2,\cdots,a_n)\) 仅形成一个置换环的时候就不会出现这种情况!而显然,置换环是必要的,所以充要条件就找到了:

  • 覆盖 \(2\) 次;
  • \((a_1,a_2,\cdots,a_n)\) 组成一个置换环。

于是自低向上计数即可,笔者有点菜所以写了 \(O(n \log n)\)。

const int N=5e5+10;
const int mod=1e9+7;vi e[N];
int n,L[N],R[N];
int tim,df[N],lw[N],Id[N];
int cnt,dfp[N],fr[N],bk[N];void dfspr(int u, int fa) {df[u]=++tim; Id[tim]=u;for(auto v:e[u]) if(v!=fa) dfspr(v,u); lw[u]=tim;
}int ans=1;
void dfs(int u, int fa) {for(auto v:e[u]) if(v!=fa) dfs(v,u);dfp[cnt=1]=df[u];for(auto v:e[u]) if(v!=fa) dfp[++cnt]=df[v];rep(i,1,cnt+1) fr[i]=bk[i]=0;auto get=[&](int x) {if(df[u]<=x&&x<=lw[u])return (int)(upper_bound(dfp+1,dfp+1+cnt,x)-dfp)-1;return cnt+1;};auto add=[&](int x, int y) {
//		cout<<u<<" add:: "<<x<<" "<<y<<"\n"; if(bk[x]&&bk[x]!=y) ans=0;if(fr[y]&&fr[y]!=x) ans=0;bk[x]=y;fr[y]=x;return ; };auto chk=[&]() {int cc=0,c=cnt+(fa!=0);rep(i,1,c) {if(!fr[i]) {int u=i;while(u) ++cc,u=bk[u];}}if(cc==0) {int u=bk[1]; ++cc;while(u!=1) ++cc,u=bk[u];}if(cc!=c) ans=0;}; 
//	cout<<u<<" "<<L[u]<<" "<<R[u]<<"\n";if(L[u]) add(get(L[u]),1); if(R[u]) add(1,get(R[u]));for(auto v:e[u]) if(v!=fa) {if(L[v]) add(get(L[v]),get(df[v]));if(R[v]) add(get(df[v]),get(R[v]));}if(!ans) return ;int s=0;rep(i,1,cnt+(fa!=0)) s+=(fr[i]==0);chk();rep(i,1,s-1) ans=1ll*ans*i%mod;if(fr[cnt+1]) R[u]=R[Id[dfp[fr[cnt+1]]]]; else R[u]=0;if(bk[cnt+1]) L[u]=L[Id[dfp[bk[cnt+1]]]]; else L[u]=0;
//	cout<<u<<" "<<L[u]<<" "<<R[u]<<" "<<ans<<"\n";
}void Mainsolve() {cin>>n;int u,v;rep(i,1,n-1) cin>>u>>v,e[u].pb(v),e[v].pb(u);dfspr(1,0);rep(i,1,n) cin>>R[i],L[R[i]]=i;rep(i,1,n) L[i]=df[L[i]],R[i]=df[R[i]];dfs(1,0);cout<<ans<<"\n";
}

相关新闻

  • Claude周末调通AMD新GPU,AI助力跨英伟达20年CUDA护城河!
  • 数据中心是如何工作的?
  • 测试文章 - Cubox 解析测试

最新新闻

  • 生物医学科研利器Top5:从文献到国自然全搞定
  • #剧场剧院音响厂家推荐哪家?从声学设计与交付看选型逻辑 - 品牌优推
  • 2026年等离子切割加工中心推荐怎么选更靠谱 - 品牌优推
  • 2026年7月上海市静安区移动500M单宽带申请避坑全攻略 - 找卡家园
  • 海南沿海潮湿易发霉?东方全铝衣柜定做这样选省心 - 品牌优推
  • 文物数字化用什么3D扫描仪?2026年五大品牌非接触精度与细节还原力实测 - 科技焦点

日新闻

  • 终极TeamSpeak3音乐机器人搭建指南:5分钟实现语音聊天室音频播放
  • 广州海珠区内搬家攻略,平价靠谱搬家服务商推荐,专业打包搬运省心避坑全流程指南 - 厚道搬家
  • 大语言模型入门指南:从零到精通掌握AI核心技术的5大步骤

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号