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}nn2

时间复杂度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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320610.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纪中C组模拟赛总结(2019.7.8)

成绩&#xff1a; 注&#xff1a; rankrankrank是有算其它dalaodalaodalao的 hkydalaohkydalaohkydalao竟不屑于交代码 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4171717wjjwjjwjj185185185100100100858585000000212121lyflyflyf170170170100100100707…

HDU5442

HDU5442 做法&#xff1a;把原串复制一份加在后边&#xff0c;中间插特殊入个特殊字符&#xff0c;再把翻转后的串加在后边&#xff0c;同样复制一份。然后做后缀数组&#xff0c;按题意处理细节即可。 #include <cstdio> #include <iostream> #include <algori…

Asp.Net Core SignalR 与微信小程序交互笔记

什么是Asp.Net Core SignalRAsp.Net Core SignalR 是微软开发的一套基于Asp.Net Core的与Web进行实时交互的类库&#xff0c;它使我们的应用能够实时的把数据推送给Web客户端。功能自动管理连接允许同时广播到所有客户端也可以广播到指定的组或者特定的客户端在Github上开源&am…

手机(jzoj 1983)

手机 jzoj 1983 题目大意&#xff1a; 在手机输入键盘上有很多键&#xff08;如下图&#xff09;&#xff0c;每一个位置按一次就是第一个字母&#xff0c;第二次就是第二个字母&#xff08;空格按0一次&#xff09;&#xff0c;现在问打出一条信息最少按几下&#xff1f; …

P2371-[国家集训队]墨墨的等式【同余最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P2371 题目大意 nnn个aia_iai​&#xff0c;求有多少个b∈[l,r]b\in[l,r]b∈[l,r]满足∑i1naixib\sum_{i1}^na_ix_ib∑i1n​ai​xi​b有正整数解。 解题思路 因为有一个a1a_1a1​在&#xff0c;而且x1x_1x1​可以是任意正整数…

HDU5514 Frogs

HDU5514 Frogs 题意&#xff1a;将\([0,m)\)所有符合\(a[i]*t ~mod~ m\)的值求和 做法&#xff1a; \(a[i]*t ~mod~ m\) 会在 \(gcd(a[i],m)\) 的倍数出现&#xff0c;因此问题等价与求&#xff1a;\[ \sum_{i1}^{m-1} [ [(a[1],m)|i] or [(a[2],m)|i] or ... or [(a[n],m)|i] …

HDU5573

HDU5573 做法&#xff1a;本题的关键在于题目限制了n≤2^k&#xff0c;如果可以不选的话&#xff0c;我就会用最左边的1&#xff0c;2&#xff0c;4...凑出n&#xff0c;这里需要用减法&#xff0c;于是先把所有的数都加到答案里&#xff0c;这个值与n的插值&#xff0c;就是我…

【结论】游戏(jzoj 1984)

游戏 jzoj 1984 题目大意&#xff1a; 有很多个点&#xff0c;两个人每次可以取走2k2^k2k&#xff08;k是一个自然数&#xff0c;可以自己选&#xff09;个点&#xff0c;取走最后一个点的人胜利&#xff0c;现在你先选&#xff0c;问你是否能赢&#xff08;能赢输出MaoLaoD…

Go vs .NET Core 2.1

.NET Core 2.1 正式发布之际&#xff0c;微软团队在博客的中提到了 .NET Core 2.1 中的性能提升。这让我想起了去年 Go 语言 Iris MVC 框架作者做的 Go 与 .NET Core 2.0 之间的性能对比(具体可看https://hackernoon.com/go-vs-net-core-in-terms-of-http-performance-7535a61b…

CF786E-ALT【网络流,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF786E 题目大意 nnn个点的一棵树&#xff0c;mmm个人每个人走一个路径。 给一些人狗或者一些边狗每个人要求要么它自己有狗要么它走的路径上都有狗。 解题思路 考虑最小割&#xff0c;其实就是要么割一个人要么割一整条路径…

HDU6038 - Function

HDU6038 - Function 做法&#xff1a; 展开后有&#xff0c;\(f(i) b_{f(a_i)} b_{b_{f(a_{a_i})}} ... b_{b_{..b_{f(i)}}}\)&#xff0c;可以发现当 \(a_i\) 所在的循环节中确定一个时&#xff0c;整个循环都确定了&#xff0c;根据这个式子还可以发现&#xff0c;对于一…

.NET Core TDD 前传: 编写易于测试的代码 -- 依赖项

第1篇: 讲述了如何创造"缝". "缝"(seam)是需要知道的概念.第2篇, 避免在构建对象时写出不易测试的代码.本文是第3篇, 讲述依赖项和迪米特法则.迪米特法则 (Law of Demeter)还是使用建造汽车的例子. 生产汽车的时候需要轮胎, 组装时需要什么型号的轮胎, 就…

【dfs】家族(jzoj 1985)

家族 jzoj 1985 解题思路&#xff1a; 在一个只含空格&#xff0c;‘*’号和小写字母的图上&#xff0c;问有多少个连在一起&#xff08;上下左右四个方向&#xff09;的小写字母块 输入样例 4 *zlw**pxh l*zlwk*hx* w*tyy**yyyzzl输出样例 3数据范围 10%的数据&#xf…

51nod1325-两棵树的问题【最大权闭合图,网络流】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1325 题目大意 两棵树。要求选出一组权值和最大的点使得这两个点集在两棵树上都是连通的。 解题思路 我们枚举一个中间点iii&#xff0c;然后从这个点开始扩展连通块。那么如果这个点作为根的话&#x…

【背包】作业(jzoj 1986)

作业 jzoj 1986 解题思路&#xff1a; ‘光光’在暑假有很多作业&#xff0c;但他不能全部做完&#xff0c;他只有一定的时间&#xff0c;某一项作业没做完&#xff08;有一点没做完也算&#xff09;&#xff0c;他就会有一个不开心值&#xff0c;现在问不开心值最小是多少 …

HDU5875 - Function

HDU5875 - Function 做法&#xff1a;st表二分的经典题。不能使用数学函数log&#xff0c;否则会tle&#xff0c;需要预处理 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define per(i,a,b) for(int ia;i>b;--i) #define mem(a,b) memset(a,b,s…

.Net Core中的日志组件(Logging)

1、介绍Logging组件是微软实现的日志记录组件包括控制台(Console)、调试(Debug)、事件日志(EventLog)和TraceSource&#xff0c;但是没有实现最常用用的文件记录日志功能(可以用其他第三方的如NLog、Log4Net。之前写过NLog使用的文章)。2、默认配置新建.Net Core Web Api项目&a…

51nod1551-集合交易【hall定理,最大权闭合图,网络流】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1551 题目大意 nnn个集合&#xff0c;nnn个物品&#xff0c;每个集合有一些物品&#xff0c;一个价钱。满足任意kkk个集合都有kkk种不同的物品。 要求一个最低的价格来购买集合且购买集合数等于里面不同…

HDU5874 - Friends and Enemies

HDU5874 - Friends and Enemies 题意&#xff1a;m个人&#xff0c;n种颜色的石头&#xff0c;两个人不是朋友就是敌人&#xff0c;朋友之间至少有一个同种颜色的石头&#xff0c;敌人之间不能有相同的石头&#xff0c;问用最多种的石头的情况下&#xff0c;n能否满足要求 做法…

纪中C组模拟赛总结(2019.7.9)

成绩&#xff1a; 注&#xff1a;rankrankrank是有算其他dalaodalaodalao的 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky400400400100100100100100100100100100100100100303030tjhtjhtjh240240240100100100303030101010100100100696969fyfy…