当前位置: 首页 > news >正文

CF1254E

很想许多 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";
}
http://www.jsqmd.com/news/1290378/

相关文章:

  • 数据中心是如何工作的?
  • 2026年B端主流外贸AI获客工具深度实测:跨境魔方等领英、谷歌搜客工具实用反馈
  • 2026哈尔滨快速拿证驾校哪家好 实力优选指南 - 谁都没有我好看
  • Claude周末调通AMD新GPU,AI助力跨英伟达20年CUDA护城河!
  • 2026年定安员工风采文化墙厂家服务选型参考指南 - 热点品牌推荐
  • 速优:中小商家零门槛抢占AI新流量,打破数字营销壁垒 - 天下观知
  • 前后端一起消失,后面看AI全栈了
  • 八重风控防刷护航,人人微投票打造级反诈公正评选 - 投票评选制作软件系统
  • 测试文章 - Cubox 解析测试
  • 拆解单簧管四大选购成本,3款入门高性价比单簧管实测推荐
  • 全天候极速响应,365评选适配碎片化临时反诈评优场景 - 投票评选制作软件系统
  • Java反序列化漏洞深度分析与攻防实践
  • 2026哈尔滨高效拿证驾校电话 靠谱学车机构指南 - 谁都没有我好看
  • 2026广州靠谱搬家公司怎么选 到家兄弟搬家十年专业服务专业服务解搬家痛点 - 到家兄弟搬家
  • 2026年 医用同质透心塑胶地板施工推荐:无尘耐磨/防滑抗菌/医疗级地坪工程实力厂家深度解析 - 优企名品
  • 如何快速将B站缓存的m4s文件合并为MP4:免费跨平台视频备份完整指南
  • 为什么设计师们都爱用Bebas Neue?这款开源字体如何解决你的排版难题
  • Qlib终极指南:如何用AI量化投资平台轻松构建你的第一个智能交易策略
  • 2026 年 7 月广州海珠南洲小区大件家具搬家行情参考,收费明细、常见陷阱与完整避坑指南 - 厚道搬家
  • 终极指南:如何让小爱音箱秒变智能AI语音助手
  • 零门槛极速运维,天天评选投票适配基层常态化反诈评优工作 - 投票评选制作软件系统
  • 2026最新静安区断桥铝门窗/隔热阳光房定做公司怎么选?选购指南+避坑要点+推荐 - mobible
  • [GESP202606 四级] 扫雷
  • 2026 年 7 月广州海珠广州塔周边搬家收费新标准详解、计价规则、附加费用与避坑指南 - 厚道搬家
  • 身在大厂,在职找工作,总感觉心虚。。。
  • 2026 年现阶段磐安有实力的标书制作公司哪家可靠,做这个拿千万级订单的文书,原来比写方案还省心,你还在瞎熬大夜? - 企业官方推荐【认证】
  • 2026 年至今,社旗值得关注的供暖热量表销售厂家联系电话,别再瞎烧了!这台小设备帮你省下冬季暖气费-荣祥电子 - 行业甄选官
  • 扬州考公培训线下班推荐:【荣上公考】备考优选 - 18102756859
  • ScreenToGif:把屏幕操作变成动图,这款开源小工具为什么成了教程党的标配?
  • 6000万美元合作两年后,“美国贴吧”Reddit为何想切断谷歌AI内容访问权限?