51nod1601-完全图的最小生成树计数【Trie,分治】
正题
题目链接: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(nloga)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,分治】相关推荐
- 【CF888G】Xor-MST(最小生成树,Trie树)
[CF888G]Xor-MST(最小生成树,Trie树) 题面 CF 洛谷 题解 利用\(Kruskal\)或者\(Prim\)算法都很不好计算. 然而我们还有一个叫啥来着?\(B\)啥啥的算法,就叫 ...
- 树的Prufer 编码和最小生成树计数
Prufer数列 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2.它可以通过简单的迭代方法计 ...
- bzoj1016 [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 6032 Solved: 2452 [Submit][ ...
- BZOJ 1016--[JSOI2008]最小生成树计数(kruskal搜索)
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 7429 Solved: 3098 [Submit][ ...
- 最小生成树计数(洛谷-P4208)
题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的 ...
- 最小生成树计数(HYSBZ-1016)(加强版实现)
Problem Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最 ...
- 最小生成树计数(HYSBZ-1016)(简化版实现)
Problem Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- bzoj 1016: [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5893 Solved: 2395 [Submit][ ...
- 洛谷4208 最小生成树计数
题意 最小生成树计数 思路 基尔霍夫kirchhoff矩阵N-1阶主子式的行列式即为最小生成树的数目,需要注意这里必须满足每一条边都相等. 基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接 ...
最新文章
- 10没有基于策略的qos_分布式QoS算法解析
- 基于Android设备的Kali Linux渗透测试教程第1章渗透测试
- 线程 synchronized锁机制
- Quick Audience组织和工作空间功能解读
- 案例:使用BeautifuSoup4的爬虫
- php 设置 最大内存,修改PHP的memory_limit限制的方法分享
- bash给脚本加进度条_shell脚本实现进度条
- Ubuntu18.04下编译tslib触摸屏驱动
- Android对接蓝牙打印机
- 轻松搞懂【TF-IDF、word2vec、svm、cnn、textcnn、bilstm、cnn+bilstm、bilstm+attention实现】英文长文本分类
- PHP将图片剪切成圆形
- 操作系统 | 银行家算法
- 基于Gamebuino设计的算盘小游戏
- 正则匹配过滤出微信公众号模板内容
- 抖快齐聚短剧战场,是加重“同质化”还是搅动“视频格局”?
- Skype for Business Server与Microsoft Teams的长期共存模式
- 小程序开发的基础与进阶
- m2硬盘写入速度测试软件,实测:M2固态硬盘换个插槽传输速度竟然提升了约1000M!...
- Python环境搭建(mac)
- 广西教育学院计算机技术专业可以当老师吗,广西教育学院老师待遇 广西教育学院好吗...
热门文章
- vue路由上的#/怎么去掉_如何去掉vue路由中的#
- android管理activity顺序,android activity 六个主要函数以及一些调用顺序
- MySQL调用mongodb事务回滚_SpringBoot整合MongoDB,在多数据源下实现事务回滚。
- 六元均匀直线阵的各元间距为_实验二 均匀直线阵
- 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读
- python中abc属于字符串吗_在Python中,字符串s = 'abc',那么执行表达式s+'d'之后,s的打印结果是( )。...
- oracle拆分分区语法详解大全_Oracle hash的分区方法详解
- facade java_Java设计模式之Facade模式
- leetcode90. 子集 II
- 7-6 区间覆盖 (10 分)(思路+详解)Come 宝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!