bzoj 4754: [Jsoi2016]独特的树叶
不得不说这是神题。
%%% http://blog.csdn.net/samjia2000/article/details/51762811
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#define inf 0x3f3f3f3f
#define LL long long
#define eps 1e-8
#define N 100005
using namespace std;
inline int ra()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
} const int mod=1e++;
const int prime=; LL tim[N],q[N];
int k;
struct node{int to,x; LL v;}u[N];
bool cmp(node a, node b){return a.v<b.v;} struct tree
{
int cnt,head[N];
struct edge{int to,next;}e[N<<];
int n,r[N],fa[N],size[N];
LL v[N],rt[N],f[N];
LL suf[N],pre[N]; void insert(int x, int y){e[++cnt].next=head[x]; e[cnt].to=y; head[x]=cnt;}
void init()
{
cnt=;
for (int i=; i<=n; i++) head[i]=r[i]=f[i]=fa[i]=rt[i]=;
for (int i=; i<n; i++)
{
int x=ra(),y=ra();
insert(x,y); insert(y,x);
r[x]++; r[y]++;
}
} void dfs1(int x)
{
size[x]=;
for (int i=head[x];i;i=e[i].next)
{
if (e[i].to==fa[x]) continue;
fa[e[i].to]=x;
dfs1(e[i].to);
size[x]+=size[e[i].to];
}
k=;
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x) q[++k]=v[e[i].to];
sort(q+,q+k+);
v[x]=;
for (int i=; i<=k; i++) v[x]=(v[x]*prime%mod+q[i])%mod;
v[x]=(v[x]*prime%mod+size[x])%mod;
} void dfs2(int x)
{
k=;
if (x>) u[++k].v=f[x],u[k].to=fa[x];
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x)
{
u[++k].to=e[i].to;
u[k].v=v[e[i].to];
}
sort(u+,u++k,cmp);
for (int i=; i<=k; i++) pre[i]=(pre[i-]*prime%mod+u[i].v)%mod;
suf[k+]=;
for (int i=k; i>=; i--) suf[i]=(suf[i+]+u[i].v*tim[k-i]%mod)%mod;
for (int i=; i<=k; i++)
if (u[i].to!=fa[x])
{
f[u[i].to]=(pre[i-]*tim[k-i]%mod+suf[i+])%mod;
f[u[i].to]=(f[u[i].to]*prime%mod+n-size[u[i].to])%mod;
}
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x) dfs2(e[i].to);
}
void cal()
{
dfs1(); dfs2();
for (int x=; x<=n; x++)
{
k=;
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x) q[++k]=v[e[i].to];
if (fa[x]) q[++k]=f[x];
sort(q+,q+k+);
rt[x]=;
for (int i=; i<=k; i++) rt[x]=(rt[x]*prime%mod+q[i])%mod;
rt[x]=(rt[x]*prime%mod+n)%mod;
}
}
}a,b; int m;
set<LL> s; int main(int argc, char const *argv[])
{
tim[]=; s.clear();
m=ra();
for (int i=; i<=m+; i++) tim[i]=tim[i-]*prime%mod;
a.n=m; a.init(); b.n=m+; b.init(); a.cal(); b.cal();
for (int i=; i<=m; i++) s.insert(a.rt[i]);
for (int i=; i<=m+; i++)
if (b.r[i]== && ((i!= && s.find(b.f[i])!=s.end()) || (i== && s.find(b.v[b.e[b.head[i]].to])!=s.end())))
{
printf("%d\n",i); return ;
}
return ;
}
bzoj 4754: [Jsoi2016]独特的树叶的更多相关文章
- BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构
题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...
- BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...
- Luogu P4323 [JSOI2016]独特的树叶
一道比较好的树Hash的题目,提供一种不一样的Hash方法. 首先无根树的同构判断一般的做法只有树Hash,所以不会的同学可以做了Luogu P5043 [模板]树同构([BJOI2015]树的同构) ...
- bzoj4754[JSOI2016]独特的树叶
这个题....别人写得怎么都....那么短啊? 我怎么....WA了好几次啊....怎么去loj扒了数据才调出来啊? 这个算法...怎么我还是不知道对不对啊 怎么回事啊怎么回事啊怎么回事啊? 请无视上 ...
- BZOJ4754 JSOI2016独特的树叶(哈希)
判断两棵无根树是否同构只需要把重心提作根哈希即可.由于只添加了一个叶子,重心的位置几乎不发生偏移,所以直接把两棵树的重心提起来,逐层找哈希值不同且对应的两子树即可.被一个普及组子问题卡一年. #inc ...
- Luogu 4323 [JSOI2016]独特的树叶
新技能get 树哈希,考虑到两棵树相同的条件,把每一个结点的哈希值和树的siz写进哈希值里去. 做出A树每一个结点为根时的树的哈希值丢进set中,然后暴力枚举B树中度数为1的点,求出删掉这个点之后的哈 ...
- P4323 [JSOI2016]独特的树叶(树哈希)
传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define l ...
- [JSOI2016]独特的树叶
https://zybuluo.com/ysner/note/1177340 题面 有一颗大小为\(n\)的树\(A\),现加上一个节点并打乱编号,形成树\(B\),询问加上的节点最后编号是多少? \ ...
- 【BZOJ4754】独特的树叶(哈希)
[BZOJ4754]独特的树叶(哈希) 题面 BZOJ 给定一个\(n\)个节点的树A和一个\(n+1\)个节点的树\(B\) 求\(B\)的一个编号最小的节点,使得删去这个节点后\(A,B\)同构 ...
随机推荐
- pagehelper 分页不生效,总页数总是1解决方案
问题: 后台查询后的数据只有1页,已经设置了PageHelper也没用 PageHelper.startPage(pageNum,pageSize); ModelAndView mv=new Mode ...
- 07 DTFT
DTFT 连续时间傅里叶变换(CTFT) 连续时间傅里叶变换的定义为: \[ X(j\Omega)=\int_{-\infty}^{\infty}x_a(t)e^{-j\Omega t}dt \] 其 ...
- 50道SQL练习题及答案与详细分析(MySQL)
50道SQL练习题及答案与详细分析(MySQL) 网上的经典50到SQL题,经过一阵子的半抄带做,基于个人理解使用MySQL重新完成一遍,感觉个人比较喜欢用join,联合查询较少 希望与大家一起学习研 ...
- spark-调节executor堆外内存
什么时候需要调节Executor的堆外内存大小? 当出现一下异常时: shuffle file cannot find,executor lost.task lost,out of memory 出现 ...
- UIKeyWindow的设置
新建一个纯代码iOS项目,需要对AppDelegate文件和项目的Info.plist文件做一番配置. 第一步:将Info.plist中的下面两项的value删除掉(保留空字符串),如下图 第二步:在 ...
- windows系统下hosts文件的改写(为了测试nginx内网的证书代理,需要做域名解析)
1. win加R C:\WINDOWS\system32\drivers\etc 2.打开hosts文件 加入一行 IP为客户机要访问的IP地址 域名也是在nginx中定义好的 3.ct ...
- 吴裕雄--天生自然ORACLE数据库学习笔记:数据导出与导入
create directory dump_dir as 'd:\dump'; grant read,write on directory dump_dir to scott; --在cmd下 exp ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:按键提示
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- windows安装ActiveMQ以及点对点以及发布订阅
一.MQ产品的分类 1.RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量级,更适合于企业级 ...
- Chrome 浏览器新功能:共享剪贴板
导读 Chrome 79 在桌面版和 Android 版浏览器中添加了一项新的功能,名为“共享剪贴板”(shared clipboard). 简单来说,就是可以实现在电脑端复制,手机端粘贴.有了这项功 ...