正题

题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1601


题目大意

nnn个点的完全图,边(i,j)(i,j)(i,j)的权值为aixoraja_i\ xor\ a_jai​ xor aj​。求最小生成树和方案数。


解题思路

对于一个高位数,将这一位为000和这一位为111分成两个点集,那么显然是这些点集各构成一个最小生成树,然后再这两个之间的连一条边。我们可以用TrieTrieTrie树找出这两个点集之间权值最小的一条边。

因最多分到logloglog层,剩下的点集之间边权都为000,所以我们只需要考虑如何求方案数。因为purferpurferpurfer序列,所以nnn个点的完全图中的生成树数量为nn−2n^{n-2}nn−2

时间复杂度O(nlog⁡a)O(n\log a)O(nloga)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10,XJQ=1e9+7;
ll n,a[N],S,ans,maxs,sol;
struct Trie{ll t[N*30][2],siz[N*30],cnt;void Clear(){cnt=t[1][0]=t[1][1]=0;return;}void Insert(ll &x,ll val,ll dep){if(!x)x=++cnt,siz[x]=t[x][0]=t[x][1]=0;siz[x]++;if(dep<0)return;if((val>>dep)&1)Insert(t[x][1],val,dep-1);else Insert(t[x][0],val,dep-1);}void Ask(ll x,ll val,ll dep,ll ans){if(!x)return;if(dep<0){if(ans<maxs)maxs=ans,sol=siz[x];else if(ans==maxs)sol+=siz[x];return;}ll w=(val>>dep)&1; if(t[x][w])Ask(t[x][w],val,dep-1,ans);else Ask(t[x][w^1],val,dep-1,ans|(1<<dep));return;}
}T;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void solve(ll dep,ll l,ll r){if(dep<0){if(r-l>0)S*=power(r-l+1,r-l-1);return;}ll cut=r+1;for(ll i=l;i<=r;i++)if((a[i]>>dep)&1){cut=i;break;}if(cut==l||cut>r)solve(dep-1,l,r);else{T.Clear();ll rt=0;for(ll i=l;i<cut;i++)T.Insert(rt,a[i],30);maxs=2147483647;sol=1;for(ll i=cut;i<=r;i++)T.Ask(rt,a[i],30,0);S=S*sol%XJQ;ans+=maxs;solve(dep-1,l,cut-1);solve(dep-1,cut,r);}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+1+n);S=1;solve(30,1,n);printf("%lld\n%lld",ans,S);
}

51nod1601-完全图的最小生成树计数【Trie,分治】相关推荐

  1. 【CF888G】Xor-MST(最小生成树,Trie树)

    [CF888G]Xor-MST(最小生成树,Trie树) 题面 CF 洛谷 题解 利用\(Kruskal\)或者\(Prim\)算法都很不好计算. 然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫 ...

  2. 树的Prufer 编码和最小生成树计数

    Prufer数列 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它可以通过简单的迭代方法计 ...

  3. bzoj1016 [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 6032  Solved: 2452 [Submit][ ...

  4. BZOJ 1016--[JSOI2008]最小生成树计数(kruskal搜索)

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7429  Solved: 3098 [Submit][ ...

  5. 最小生成树计数(洛谷-P4208)

    题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的 ...

  6. 最小生成树计数(HYSBZ-1016)(加强版实现)

    Problem Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最 ...

  7. 最小生成树计数(HYSBZ-1016)(简化版实现)

    Problem Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最 ...

  8. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

  9. bzoj 1016: [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5893  Solved: 2395 [Submit][ ...

  10. 洛谷4208 最小生成树计数

    题意 最小生成树计数 思路 基尔霍夫kirchhoff矩阵N-1阶主子式的行列式即为最小生成树的数目,需要注意这里必须满足每一条边都相等. 基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接 ...

最新文章

  1. 10没有基于策略的qos_分布式QoS算法解析
  2. 基于Android设备的Kali Linux渗透测试教程第1章渗透测试
  3. 线程 synchronized锁机制
  4. Quick Audience组织和工作空间功能解读
  5. 案例:使用BeautifuSoup4的爬虫
  6. php 设置 最大内存,修改PHP的memory_limit限制的方法分享
  7. bash给脚本加进度条_shell脚本实现进度条
  8. Ubuntu18.04下编译tslib触摸屏驱动
  9. Android对接蓝牙打印机
  10. 轻松搞懂【TF-IDF、word2vec、svm、cnn、textcnn、bilstm、cnn+bilstm、bilstm+attention实现】英文长文本分类
  11. PHP将图片剪切成圆形
  12. 操作系统 | 银行家算法
  13. 基于Gamebuino设计的算盘小游戏
  14. 正则匹配过滤出微信公众号模板内容
  15. 抖快齐聚短剧战场,是加重“同质化”还是搅动“视频格局”?
  16. Skype for Business Server与Microsoft Teams的长期共存模式
  17. 小程序开发的基础与进阶
  18. m2硬盘写入速度测试软件,实测:M2固态硬盘换个插槽传输速度竟然提升了约1000M!...
  19. Python环境搭建(mac)
  20. 广西教育学院计算机技术专业可以当老师吗,广西教育学院老师待遇 广西教育学院好吗...

热门文章

  1. vue路由上的#/怎么去掉_如何去掉vue路由中的#
  2. android管理activity顺序,android activity 六个主要函数以及一些调用顺序
  3. MySQL调用mongodb事务回滚_SpringBoot整合MongoDB,在多数据源下实现事务回滚。
  4. 六元均匀直线阵的各元间距为_实验二 均匀直线阵
  5. 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读
  6. python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...
  7. oracle拆分分区语法详解大全_Oracle hash的分区方法详解
  8. facade java_Java设计模式之Facade模式
  9. leetcode90. 子集 II
  10. 7-6 区间覆盖 (10 分)(思路+详解)Come 宝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!