#01-Trie,Cayley定理#51nod 1601 完全图的最小生成树计数
分析
考虑建出一棵Trie,然后最小生成树就是0的部分到1的部分连一条边,
这个可以用区间短的一方查询另一棵trie,这样时间复杂度为 \(O(n\log^2{mx})\)
方案数注意相同的 \(n\) 个点的无根树为 \(n^{n-2}\)
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=3000011,mod=1000000007; long long ans;
int trie[N][2],L[N],R[N],tot=1,Ans=1,n,a[N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int ksm(int x,int y){
int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
void Insert(int x,int rk){
int p=1;
for (int i=29;~i;--i){
int z=(x>>i)&1;
if (!trie[p][z]) trie[p][z]=++tot;
p=trie[p][z],R[p]=rk;
if (!L[p]) L[p]=rk;
}
}
int query(int p,int dep,int x,int &C){
if (dep<0){
C=R[p]-L[p]+1;
return 0;
}
int z=(x>>dep)&1;
if (trie[p][z]) return query(trie[p][z],dep-1,x,C);
else return query(trie[p][z^1],dep-1,x,C)|(1<<dep);
}
long long dfs(int p,int dep){
if (dep<0){
int len=R[p]-L[p]+1;
if (len>2) Ans=1ll*Ans*ksm(len,len-2)%mod;
return 0;
}
int ls=trie[p][0],rs=trie[p][1],ans0=1<<30,ans1=0;
if (!ls) return dfs(rs,dep-1);
if (!rs) return dfs(ls,dep-1);
if (R[ls]-L[ls]>R[rs]-L[rs]) ls^=rs,rs^=ls,ls^=rs;
for (int i=L[ls],C;i<=R[ls];++i){
int now=query(rs,dep-1,a[i],C);
if (ans0>now) ans0=now,ans1=C;
else if (ans0==now) ans1=(ans1+C)%mod;
}
Ans=1ll*Ans*ans1%mod;
return dfs(ls,dep-1)+dfs(rs,dep-1)+ans0+(1<<dep);
}
int main(){
n=iut(),L[1]=1,R[1]=n;
for (int i=1;i<=n;++i) a[i]=iut();
sort(a+1,a+1+n);
for (int i=1;i<=n;++i) Insert(a[i],i);
ans=dfs(1,29);
return !printf("%lld\n%d",ans,Ans);
}
#01-Trie,Cayley定理#51nod 1601 完全图的最小生成树计数的更多相关文章
- 51Nod 1601 完全图的最小生成树计数
题目链接 分析: 这是一张完全图,并且边的权值是由点的权值$xor$得到的,所以我们考虑贪心的思想,考虑$kruskal$的过程选取最小的边把两个连通块合并,所以我们可以模仿$kruskal$的过程, ...
- 「51Nod 1601」完全图的最小生成树计数 「Trie」
题意 给定\(n\)个带权点,第\(i\)个点的权值为\(w_i\),任意两点间都有边,边权为两端点权的异或值,求最小生成树边权和,以及方案数\(\bmod 10^9 + 7\) \(n \leq 1 ...
- 51Nod1601 完全图的最小生成树计数 Trie Prufer编码
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1601.html 题目传送门 - 51Nod1601 题意 题解 首先我们考虑如何求答案. 我们将所有 ...
- 51Nod1601 完全图的最小生成树计数
传送门 我居然忘写题解啦!(记忆废) 不管怎么说,这题还算是一道好题啊……你觉得敦爷出的题会有水题么 …… 这题比较容易把人误导到Boruvka算法之类的东西上去(我们机房去刚D题的人一开始大多也被误 ...
- prufer编码 cayley定理
背景(在codeforces 917D 报废后,看题解时听闻了这两个玩意儿.实际上917D与之“木有关西”,也可以认为是利用了prufer的一些思路.) 一棵标号树的Pufer编码规则如下:找到标号最 ...
- Prüfer序列和cayley定理
参考资料: 1.matrix67 <经典证明:Prüfer编码与Cayley公式> 2.百度百科 3.Forget_forever prufer序列总结 4.维基百科 5.dirge的学习 ...
- Nyoj 星际之门(一)(Cayley定理)
描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门,它利用虫洞技术,一条虫洞可以连通任意的两个星系,使人们不必再待待便可立刻到达目的地. 帝国 ...
- Codeforces1113F. Sasha and Interesting Fact from Graph Theory(组合数学 计数 广义Cayley定理)
题目链接:传送门 思路: 计数.树的结构和边权的计数可以分开讨论. ①假设从a到b的路径上有e条边,那么路径上就有e-1个点.构造这条路径上的点有$A_{n-2}^{e-1}$种方案: ②这条路径的权 ...
- hdu 4825 Xor Sum (01 Trie)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4825 题面: Xor Sum Time Limit: 2000/1000 MS (Java/Others) ...
- 图论:Prufer编码-Cayley定理
BZOJ1430:运用Cayley定理解决树的形态统计问题 由Prufer编码可以引申出来一个定理:Cayley 内容是不同的n结点标号的树的数量为n^(n-2) 换一种说法就是一棵无根树,当知道结点 ...
随机推荐
- 【Android 逆向】【ARM汇编】 全局资源重定位
资源重定位解释: 字符串反汇编代码解释: .rodata:00001E20 __exidx_end DCB "a + b = %d" ; DATA_XREF: main+28^o ...
- 领略一下swift函数派发机制流程
函数派发 Swift中函数的派发机制有三种:静态派发,函数表派发,消息派发. 静态派发 静态派发是指在运行时不需要查表,直接跳转到方法进行执行.静态派发的性能也是最高的.c语言采用的是直接派发. 函数 ...
- 【Azure 应用服务】在Azure Funciton中使用Powershell脚本函数,需要存储一些变量值如何解决?
问题描述 使用Azure Function创建Powershell脚本来执行函数,在使用中需要存储一些不重要的参数.一般情况,存储的问题都是交给DB,Storage等来解决.但是有没有一种简单的办法呢 ...
- 聊聊 HTTP 性能优化
哈喽大家好,我是咸鱼. 作为用户的我们在 "上网冲浪" 的时候总是希望快一点,尤其是抢演唱会门票的时候,但是现实并非如此,有时候我们会遇到页面加载缓慢.响应延迟的情况. 而 HTT ...
- 回顾 2023,NebulaGraph 的这一年的变化
一年又过去了,感谢你和 NebulaGraph 一起又走过一个春夏秋冬.在这 365 天里,我们一起见证了 214 个 commit 带来的 NebulaGraph 3 个中版本的上线,它们分别是 v ...
- 案例7:将"picK"译成密码
密码规则:用当前字母后面的第五各字符来代替当前字符.比如字符'a'后面的第5个字符为'f', 则使用'f'代替'a'.编写程序,实现该功能. 示例代码如下: #define _CRT_SECURE_N ...
- vue-helper 组件 跳转 | Vue Jump to Tag 好用,需自己设定快捷键 | Path Intellisense
vue-helper 组件 跳转 组件名称 除首字母大写,其他不能有大写字母,否则不能跳转 比如 mycomponent 这个名字可以 Mycomponent 这个名字可以 myComponent 这 ...
- pod为什么会被驱逐及如何避免pod被驱逐导致的服务中断
Pod被驱逐的原因主要有以下几点: 资源不足:当节点资源(如CPU.内存.存储等)不足以满足Pod的资源需求时,调度器会选择将其中一个或多个Pod驱逐出节点,以便在资源有限的节点上安排新的Pod. 超 ...
- 面试官:小伙子,能聊明白JMM给你SSP!我:嘚吧嘚吧一万字,直接征服面试官!
写在开头 面试官:小伙子,JMM了解吗? 我:JMM(Java Memory Model),Java内存模型呀,学过的! 面试官:那能给我详细的聊一聊吗,越详细越好! 我:嗯~,确定越详细越好?起码得 ...
- Spring Boot学习日记3
学习了创建项目的几个重要核心步骤 1.创建一个新项目 2.选择spring initalizr , 可以看到默认就是去官网的快速构建工具那里实现 3.填写项目信息 4.选择初始化的组件(初学勾选 We ...