[zoj3990]Tree Equation
记$dep(T)$为树$T$的深度(根节点深度为0),则有$\begin{cases}dep(A+B)=\max(dep(A),dep(B))\\dep(A\cdot B)=dep(A)+dep(B)\end{cases}$
考虑$C$中最深的点,对其来源于$AX$还是$BY$分类讨论(不妨假设是前者),再取出其深度为$dep(A)$的祖先,那么$X$即只能取该祖先的子树
确定$X$后,求出$AX$并在$C$中去掉,再类似地求出$Y$并判定即可
过程中需要实现一个树同构的判定,简单哈希即可
时间复杂度为$o(n\log n)$,可以通过
(实现可能略微有一些繁琐,由于无法提交并不保证代码正确,仅供参考)

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define mod 998244353
5 #define ll long long
6 int t,num[11],seed[N];
7 map<int,vector<int> >mat;
8 map<int,vector<int> >::iterator it;
9 int read(){
10 int x=0;
11 char c=getchar();
12 while ((c<'0')||(c>'9'))c=getchar();
13 while ((c>='0')&&(c<='9')){
14 x=x*10+c-'0';
15 c=getchar();
16 }
17 return x;
18 }
19 void write(int x,char c='\0'){
20 while (x){
21 num[++num[0]]=x%10;
22 x/=10;
23 }
24 if (!num[0])putchar('0');
25 while (num[0])putchar(num[num[0]--]+'0');
26 putchar(c);
27 }
28 struct Tree{
29 int n,rt,mx,fa[N],dep[N],sz[N],f[N];
30 vector<int>v[N];
31 bool operator == (const Tree &T)const{
32 return (sz[rt]==T.sz[T.rt])&&(f[rt]==T.f[T.rt]);
33 }
34 void Read(){
35 for(int i=1;i<=n;i++)v[i].clear();
36 for(int i=1;i<=n;i++){
37 int x=read();
38 if (!x)rt=i;
39 else v[x].push_back(i);
40 }
41 }
42 void Write(){
43 for(int i=1;i<n;i++)write(fa[i],' ');
44 write(fa[n],'\n');
45 }
46 void dfs(int k,int s){
47 dep[k]=s,sz[k]=f[k]=1;
48 for(int i=0;i<v[k].size();i++){
49 fa[v[k][i]]=k,dfs(v[k][i],s+1);
50 sz[k]+=sz[v[k][i]];
51 f[k]=(f[k]+(ll)f[v[k][i]]*seed[sz[v[k][i]]])%mod;
52 }
53 }
54 void build(){
55 fa[rt]=0,dfs(rt,0);
56 mx=0;
57 for(int i=1;i<=n;i++)mx=max(mx,dep[i]);
58 }
59 void get(Tree &T,int k,int f){
60 int id=++T.n;
61 T.v[id].clear();
62 if (f)T.v[f].push_back(id);
63 for(int i=0;i<v[k].size();i++)get(T,v[k][i],id);
64 }
65 }A,B,C,X,Y,T,T0;
66 void mul(Tree &A,Tree &B,Tree &T){
67 T.n=A.n*B.n,T.rt=(A.rt-1)*B.n+1;
68 for(int i=1;i<=T.n;i++)T.v[i].clear();
69 for(int i=1;i<=A.n;i++){
70 for(int j=0;j<A.v[i].size();j++)T.v[(i-1)*B.n+1].push_back((A.v[i][j]-1)*B.n+1);
71 for(int j=1;j<=B.n;j++)
72 for(int k=0;k<B.v[j].size();k++)T.v[(i-1)*B.n+j].push_back((i-1)*B.n+B.v[j][k]);
73 }
74 }
75 bool dec(Tree &A,Tree &B,Tree &T){
76 mat.clear();
77 for(int i=0;i<A.v[A.rt].size();i++)mat[A.f[A.v[A.rt][i]]].push_back(A.v[A.rt][i]);
78 T.n=T.rt=1,T.v[1].clear();
79 for(int i=0;i<B.v[B.rt].size();i++){
80 int x=B.f[B.v[B.rt][i]];
81 if (mat[x].empty())return 0;
82 mat[x].pop_back();
83 }
84 for(it=mat.begin();it!=mat.end();it++){
85 vector<int>v=(*it).second;
86 for(int i=0;i<v.size();i++)A.get(T,v[i],1);
87 }
88 return 1;
89 }
90 bool calc(){
91 int pos;
92 for(int i=0;i<=C.n;i++)
93 if (C.dep[i]==C.mx)pos=i;
94 while (C.dep[pos]!=A.mx)pos=C.fa[pos];
95 X.n=0,X.rt=1,C.get(X,pos,0),X.build();
96 if ((ll)A.n*X.n>C.n)return 0;
97 mul(A,X,T),T.build();
98 if (!dec(C,T,T0))return 0;
99 T0.build();
100 for(int i=0;i<=T0.n;i++)
101 if (T0.dep[i]==T0.mx)pos=i;
102 while (T0.dep[pos]!=B.mx)pos=T0.fa[pos];
103 Y.n=0,Y.rt=1,T0.get(Y,pos,0),Y.build();
104 if ((ll)B.n*Y.n!=T0.n)return 0;
105 mul(B,Y,T),T.build();
106 return T==T0;
107 }
108 int main(){
109 srand(time(0));
110 for(int i=0;i<N;i++)
111 for(int j=0;j<60;j++)seed[i]=((seed[i]<<1)+rand()%2)%mod;
112 t=read();
113 while (t--){
114 A.n=read(),B.n=read(),C.n=read();
115 A.Read(),B.Read(),C.Read();
116 A.build(),B.build(),C.build();
117 if (calc()){
118 write(X.n,' '),write(Y.n,'\n');
119 X.Write(),Y.Write();
120 continue;
121 }
122 swap(A,B);
123 if (!calc())printf("Impossible\n");
124 else{
125 write(Y.n,' '),write(X.n,'\n');
126 Y.Write(),X.Write();
127 }
128 }
129 return 0;
130 }
[zoj3990]Tree Equation的更多相关文章
- 2017 CCPC Qinhuangdao Site
A. Balloon Robot 假设机器人$0$时刻位于$0$号位置,那么每个气球所需的时间为$(s_a-b)\bmod m$. 将所有气球按这个时间排序,枚举每个气球的时间作为偏移量,得出最优解即 ...
- HDU 2489 Minimal Ratio Tree (DFS枚举+最小生成树Prim)
Minimal Ratio Tree Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- HDU 2489 Minimal Ratio Tree 最小生成树+DFS
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Tree - Information Theory
This will be a series of post about Tree model and relevant ensemble method, including but not limit ...
- HDUOJ----2489 Minimal Ratio Tree
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 2489 Minimal Ratio Tree(暴力+最小生成树)(2008 Asia Regional Beijing)
Description For a tree, which nodes and edges are all weighted, the ratio of it is calculated accord ...
- HDU2489 Minimal Ratio Tree 【DFS】+【最小生成树Prim】
Minimal Ratio Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 2489 Minimal Ratio Tree (dfs+Prim最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2489 Problem Description For a tree, which nodes and ...
- Binary search tree system and method
A binary search tree is provided for efficiently organizing values for a set of items, even when val ...
随机推荐
- 初探计算机网络之HTTPS请求
HTTPS自诞生以来,我们总是对它充满着很多的疑问,HTTPS到底是啥?HTTPS多出来的S指的是什么?HTTPS安全可靠吗?访问一个HTTPS的网站的流程等等,带着这些疑问,我们一起来揭开HTT ...
- Java初步学习——2021.10.09每日总结,第五周周六
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了菜鸟教程实例部分 一.字符串 1.字符串比较--compareTo方法 public class Main { p ...
- Java(45)JDK新特性之String流
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201671.html 博客主页:https://www.cnblogs.com/testero ...
- Golang通脉之包的管理
在工程化的开发项目中,Go语言的源码复用是建立在包(package)基础之上的. 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言提供了很多内置包,如fmt.os.io等. ...
- WEB安全指南
说明:本文是Mozilla Web应用部署文档,对运维或者后端开发团队的部署行为进行指导.该部署安全规范内容充实,对于部署有很大意义.同时也涉及到了许多web前端应用安全的基本知识,如CSP, TOK ...
- 腾讯bugly产生bug定位行数不准解决方案
定位不准是因为做了混淆导致行数与实际代码行数不对.解决方案是要上传符号表.下载地址https://bugly.qq.com/v2/downloads 下载好因为我打开文件的说明文件是空文件(可能工作人 ...
- 你知道什么是JUC了吗?
多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...
- 第五次Alpha Scrum Meeting
本次会议为Alpha阶段第五次Scrum Meeting会议 会议概要 会议时间:2021年4月30日 会议地点:线上会议 会议时长:15min 会议内容简介:本次会议以主要围绕卡牌对接的诸多问题与对 ...
- TDengine在数益工联工业物联采集平台建设中的初步实践
作者:易永耀 夏杭泰 邓炜兴 公司介绍 数益工联致力于打造基于数据流+价值流的离散制造业数字化软件:应用新一代的物联网技术与丰富的现场交互手段,融合工业工程精益思想,为离散制造业客户的数字化升级提供从 ...
- luogu P2746 [USACO5.3]校园网Network of Schools 题解
前言: 火星题... 但是我调了半天,最后看了题解才明白. Wtcl 解析: 显然先缩个点. 第一问,就是问多少入度为0的点. 第二问,抽象一下就是要添加一些边,让一个DAG变成一个SCC,求最小边数 ...