BZOJ5362: [Lydsy1805月赛]quailty 算法
BZOJ5362: [Lydsy1805月赛]quailty 算法
https://lydsy.com/JudgeOnline/problem.php?id=5362
分析:
- 题意即求一个最小基环树森林,两点之间边权为异或值。
- 这题的思路很好,先排序,我们二进制分组,将\(0\)和\(1\)分成两部分,显然这两部分之间的边能不连就不连。
- 但也有必须连的情况,就是出现某个集合大小小于等于\(2\)的情况,内部无法自身构成基环树,需要和另外一个集合连边,此时我们暴力找最小的边即可。
- 时间复杂度为\(O(nlogn)\)。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 300050
typedef long long ll;
int n,a[N],k=30;
ll ans;
void solve(int l,int r,int d) {
if(d==-1||l>=r) return ;
if(l==r-1) {ans+=a[l]^a[r]; return ;}
int mid=l,i,j;
for(;mid<=r&&!((a[mid]>>d)&1);mid++) ;
solve(l,mid-1,d-1);
solve(mid,r,d-1);
int ls=mid-l,rs=r-mid+1;
if(ls>2&&rs>2) return ;
if(ls<1||rs<1) return ;
int mn1=1<<30,mn2=1<<30;
for(i=l;i<mid;i++) {
for(j=mid;j<=r;j++) {
int x=a[i]^a[j];
if(x<mn1) mn2=mn1,mn1=x;
else if(x<mn2) mn2=x;
}
}
if(ls<=2&&rs<=2) ans+=mn1+mn2;
else ans+=mn1;
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
int i;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
ans=0;
solve(1,n,k);
printf("%lld\n",ans);
}
}
BZOJ5362: [Lydsy1805月赛]quailty 算法的更多相关文章
- [Lydsy1805月赛]quailty 算法 BZOJ5362
分析: 题目中描述了一个二分图,让我们求最小权最大匹配,实际上其实是求n个点,在n*(n-1)/2中选n条边的权值和最小,形成一个每个点都有出边的体系,也就是基环树,(证明:因为我们需要二分图最大匹配 ...
- [Lydsy1805月赛] quailty 算法
稍微建一下模型就可以发现,题目要求的其实是一个最小异或基环森林.... 可以用类似最小生成树的拟阵性质来证明,贪心的从小的边权开始依次尝试加入的方法是对的. 所以我们把a[]排完序之后直接递归贪心就行 ...
- BZOJ_5359_[Lydsy1805月赛]寻宝游戏_DP
BZOJ5359_[Lydsy1805月赛]寻宝游戏_DP Description begin.lydsy.com/JudgeOnline/upload/201805.pdf 我们需要找到一条权值最大 ...
- [Bzoj5358][Lydsy1805月赛]口算训练(预处理+动态开点线段树)
5358: [Lydsy1805月赛]口算训练 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 318 Solved: 105[Submit][Stat ...
- [Bzoj5359][Lydsy1805月赛]寻宝游戏(dp)
5359: [Lydsy1805月赛]寻宝游戏 Time Limit: 2 Sec Memory Limit: 512 MBSubmit: 71 Solved: 19[Submit][Status ...
- BZOJ5361[Lydsy1805月赛]对称数——主席树+随机化
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5361 好神的一道题啊! 容易看出来是要用维护权值的数据结构,因此树链剖分首先pass掉. ...
- BZOJ4837:[Lydsy1704月赛]LRU算法(双指针&模拟)
Description 小Q同学在学习操作系统中内存管理的一种页面置换算法,LRU(LeastRecentlyUsed)算法. 为了帮助小Q同学理解这种算法,你需要在这道题中实现这种算法,接下来简要地 ...
- [Lydsy1805月赛]对称数 BZOJ5361
分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑 ...
- [Lydsy1805月赛]口算训练 BZOJ5358
分析: 没想到这道题还能二分查找... 这题主席树的话,裸的很显然...我们将每一个数分解质因数,之后建一个可持久化权值线段树维护[L,R]区间内的每一种质因子的个数,分解质因数的话,可以选择用线筛, ...
随机推荐
- Razor里写函数
asp.net mvc的视图里使用Razor来书写服务器代码,人尽皆知.可以常常见到里面写上for循环语句,输出一大堆东东,牛逼得很. 可是,如果循环语句还不能满足我们的要求,需要定义一个函数来调用, ...
- Is this its limit?
import sys import os curPath = os.path.abspath(os.path.dirname(__file__)) rootPath = os.path.split(c ...
- 忘记apple id如何更新应用?
最近ytkah的app有很多更新提示,之前注册的apple id好久没登录了,突然提示说登录需要验证安全问题,哪还记得噢,最要命的是邮箱收到的加密邮件也需要验证.重新注册一个吧,这次要注意保存相关信息 ...
- bug-3——onload,onbeforeunload,Onunload的区别
window.onload事件设置页面加载时执行的动作,即进入页面的时候执行的动作. window.onunload已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用 一般用于设置 ...
- VS2013 Pro版本密钥
Visual Studio Professional 2013 KEY(密钥): XDM3T-W3T3V-MGJWK-8BFVD-GVPKY
- 免费好用的Diff和Merge工具大总结
总结:比较下来:diffmerge和P4merge最好用,kdiff比较专业些,支持自动merge. 一 csdiff 下载:http://www.componentsoftware.com/Prod ...
- Java实现将一段汉字变成unicode码
public class T { public static void main(String[] args) { String s = "java 中文编码"; System.o ...
- [转]详解Java解析XML的四种方法
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...
- java WEB学习笔记32:HttpSession 接口常用方法 及 HttpServletRequest接口中的Session方法 Demo
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】
本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一 ...