Solution -「CF 959E」Mahmoud and Ehab and the xor-MST
Description
Link.
一完全图有 \(n\) 个节点 \(0,...,n-1\),其中边 \((i,j)\) 的权值为 \(i\oplus j\),其中 \(\oplus\) 为位异或操作,试求出最小生成树的边权和。
Solution
先从递推的层面考虑.
我们定义 \(F(n)\) 表示结点数为 \(n\) 的答案,也就是最小生成树的边权和.
首先边界条件为 \(F(0)=0,F(1)=1\).
然后我们考虑如何从 \(F(n-1)\) 推到 \(F(n)\).
每当我们新加入一个结点 \(n-1\)(题目结点编号从 0 开始),它的点权为其本身,也就是 \(n-1\),那么此时我们就要从之前的 \(n-1\) 个结点中选出一个点与 \(n-1\) 相连构成当前的最小生成树.
因为边 \((u,v)\) 的边权 \(w(u,v)=u\ \mathrm{xor}\ v\) 且图为完全图,所以我们每加入一个新结点 \(n-1\) 时,所有我们之前的 \(0\cdots n-2\) 号结点都可以被选择.
那么问题转化为:对于一个数 \(n-1\),我们需要选出一个整数 \(x\in[0,n-1)\) 使得 \((n-1)\ \mathrm{xor}\ x\) 最小.
考虑异或运算的定义:每一位相同为零,不同为一.
那么我们选出的 \(x\),需要满足二进制意义下每一位和 \(n-1\) 尽量相同,并且从右到左(也就是二进位从低到高)的第一个不同的位置尽量低.
那么结论就摆在眼前了,我们选择的这个 \(x\) 为 \((n-1)-\mathrm{lowbit}(n-1)\).
为什么?想想 \(\mathrm{lowbit(x)}\) 操作的定义:二进制下 \(x\) 最低的 1 和后面的 0 组成的二进制数.
这样结论的正确性就显然了.
我们 \(F(n)\) 的递推公式为 \(F(n)=F(n-1)+(n\ \mathrm{xor}\ (n\ \mathrm{xor}\ \mathrm{lowbit}(n)))\).
那么暴力递推的代码如下:
(code?)
#include<bits/stdc++.h>
using namespace std;
long long f[100005];
signed main()
{
long long n;
scanf("%lld",&n);
f[0]=0;
f[1]=1;
for(long long i=2;i<n;++i) f[i]=f[i-1]+(i^(i^(i&-i)));
printf("%lld\n",f[n-1]);
return 0;
}
仔细观察一下递推式,\(n\ \mathrm{xor}\ (n\ \mathrm{xor}\ \mathrm{lowbit}(n))\) 不就是 \(\mathrm{lowbit}(n)\) 嘛!
那么为题转化为求 \(\mathrm{lowbit}\) 前缀和.
通过打一个 \(\mathrm{lowbit}\) 表的方法,我们发现 \(\mathrm{lowbit}\) 的值十分有规律,就像这种形式:
\]
其实这种规律要证明也很方便,只要根据二进制数末尾的情况即可得知.
虽然这个规律没啥用,但是启发了我们按位统计贡献的方法在 \(\Theta(1)\) 空间 \(\Theta(\log_{2}n)\) 的时间内计算出了 \(\mathrm{lowbit}\) 前缀和.
具体方法请参考代码.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
signed main()
{
LL n;
scanf("%lld",&n);
LL ans=0,app=1,low=n;
while(low>1) ans+=app*(low>>1),low-=(low>>1),app<<=1;
printf("%lld\n",ans);
return 0;
}
Solution -「CF 959E」Mahmoud and Ehab and the xor-MST的更多相关文章
- Solution -「CF 1342E」Placing Rooks
\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...
- Solution -「CF 1622F」Quadratic Set
\(\mathscr{Description}\) Link. 求 \(S\subseteq\{1,2,\dots,n\}\),使得 \(\prod_{i\in S}i\) 是完全平方数,并最 ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「CF 923E」Perpetual Subtraction
\(\mathcal{Description}\) Link. 有一个整数 \(x\in[0,n]\),初始时以 \(p_i\) 的概率取值 \(i\).进行 \(m\) 轮变换,每次均匀随机 ...
- Solution -「CF 1586F」Defender of Childhood Dreams
\(\mathcal{Description}\) Link. 定义有向图 \(G=(V,E)\),\(|V|=n\),\(\lang u,v\rang \in E \Leftrightarr ...
- Solution -「CF 1237E」Balanced Binary Search Trees
\(\mathcal{Description}\) Link. 定义棵点权为 \(1\sim n\) 的二叉搜索树 \(T\) 是 好树,当且仅当: 除去最深的所有叶子后,\(T\) 是满的: ...
- Solution -「CF 623E」Transforming Sequence
题目 题意简述 link. 有一个 \(n\) 个元素的集合,你需要进行 \(m\) 次操作.每次操作选择集合的一个非空子集,要求该集合不是已选集合的并的子集.求操作的方案数,对 \(10^9 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
- Solution -「CF 599E」Sandy and Nuts
\(\mathcal{Description}\) Link. 指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...
- Solution -「CF 487E」Tourists
\(\mathcal{Description}\) Link. 维护一个 \(n\) 个点 \(m\) 条边的简单无向连通图,点有点权.\(q\) 次操作: 修改单点点权. 询问两点所有可能路 ...
随机推荐
- Galaxy v-21.01 发布,新的流程和历史栏体验
Galaxy Project(https://galaxyproject.org/)是在云计算背景下诞生的一个生物信息学可视化分析开源项目. 该项目由美国国家科学基金会(NSF).美国国家人类基因组研 ...
- ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略
承载ASP.NET应用的服务器资源总是有限的,短时间内涌入过多的请求可能会瞬间耗尽可用资源并导致宕机.为了解决这个问题,我们需要在服务端设置一个阀门将并发处理的请求数量限制在一个可控的范围,即使会导致 ...
- A First course in FEM —— matlab代码实现求解传热问题(稳态)
这篇文章会将FEM全流程走一遍,包括网格.矩阵组装.求解.后处理.内容是大三时的大作业,今天拿出来回顾下. 1. 问题简介 涡轮机叶片需要冷却以提高涡轮的性能和涡轮叶片的寿命.我们现在考虑一个如上图所 ...
- Linux下AWK、SED、GREP、FIND命令详解
AWK AWK是一个优良的文本处理工具,Linux和Unix环境中现有的功能最强大的数据处理引擎之一. 语法 awk [选项参数] 'script' var=value file(s) 或 awk [ ...
- kaggle中训练得到的output太大该怎么下载?
最近在使用Kaggle平台训练自己的模型,但是训练结束之后由于模型过大导致output那里一直在加载(转圈),即使加载出来点击download也没有反应 下面借鉴知乎大佬的方法可以完美解决!通过将其压 ...
- SpringBoot 使用 Sa-Token 实现账号封禁、分类封禁、阶梯封禁
一.需求分析 之前的章节中,我们学习了 踢人下线 和 强制注销 功能,用于清退违规账号.在部分场景下,我们还需要将其 账号封禁,以防止其再次登录. Sa-Token 是一个轻量级 java 权限认证框 ...
- Linux-用户管理命令(必须是超级管理员-root)
useradd [名字] 创建一个新用户 (home 下创建) useradd -d [路径][名字] 路径中的名字是文件 , 登录用的后面的名字 passwd [用户名] 设置密码, ...
- 基于AIidlux平台的自动驾驶环境感知与智能预警
自动驾驶汽车又称为无人驾驶车,是一种需要驾驶员辅助或者完全不需操控的车辆. 自动驾驶分级: 自动驾驶系统的组成部分: 环境感知系统: 自动驾驶系统架构: 自动驾驶数据集: Aidlux的作用: YOL ...
- 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar
2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上 给定一个长度为n的数组ar ...
- croc-文件传输工具
前言 croc是一款用go语言开发的命令行文件传输工具,该工具允许两台计算机设备以一种简单和安全的方式来传输文件. GitHub项目地址 环境信息 IP 系统版本 croc版本 说明 192.168. ...