[Lydsy1805月赛]quailty 算法 BZOJ5362
分析:
题目中描述了一个二分图,让我们求最小权最大匹配,实际上其实是求n个点,在n*(n-1)/2中选n条边的权值和最小,形成一个每个点都有出边的体系,也就是基环树,(证明:因为我们需要二分图最大匹配,所以,我们手动模拟一下匈牙利算法发现,最大匹配一定是每个左端点连了一条边,最小权一定是每个左端点所能连的最小边权,之后将二分图压缩成一个图,其实就是每一个点连了一条边使权值和最小。并且可以发现,如果满足这个性质,最少需要3个点联通才可以。),并且每个边的边权是对应的边的两个端点的权值抑或和,在这种情况下,贪心很显然,(疑惑法则,最大位一定相同。)那么我们考虑每次分治处理两个最大位相同的部分,之后合并,如果两个联通块的大小同时>3,那么就不需要合并,如果同时大于2,那么需要合并一次,否则,合并两次。时间复杂度:O(nlogn+3*n)
在分治之前,我们必须先排一下序,不然时间复杂度就退化为O(nsqrt(n)logn)了
这个题比较神,很有趣,想了一个晚上,早上突然就会了...
附上代码:
#include <cstdio>
#include <iostream>
#include <queue>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 300005
#define ll long long
int n,a[N],T;ll ans;
void solve(int x,int l,int r)
{
if((x==-1)||(r==l))return ;
if(r-l==1){ans+=a[l]^a[r];return;}
int m=l;
while((m<=r)&&!((a[m]>>x)&1))m++;
if(m!=l)solve(x-1,l,m-1);
if(m<=r)solve(x-1,m,r);
if(m==l||m>r||(m-l>=3&&r-m+1>=3))return ;
int minn=1<<30,minx=1<<30;
for(int i=l;i<m;i++)
{
for(int j=m;j<=r;j++)
{
if((a[i]^a[j])<minn)minx=minn,minn=a[i]^a[j];
else if((a[i]^a[j])<minx)minx=a[i]^a[j];
}
}
if(m-l<=2&&r-m+1<=2)ans+=minn+minx;
else ans+=minn;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);ans=0;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);solve(30,1,n);printf("%lld\n",ans);
}
return 0;
}
[Lydsy1805月赛]quailty 算法 BZOJ5362的更多相关文章
- BZOJ5362: [Lydsy1805月赛]quailty 算法
BZOJ5362: [Lydsy1805月赛]quailty 算法 https://lydsy.com/JudgeOnline/problem.php?id=5362 分析: 题意即求一个最小基环树森 ...
- [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]区间内的每一种质因子的个数,分解质因数的话,可以选择用线筛, ...
随机推荐
- 高性能JavaScript(字符串和正则表达式)
字符串连接 +/+=操作符连接 str += "one" + "two"; 这是常用的连接字符串的方法,它运行的时候会经历下面四个步骤: 1.在内存中创建一个临 ...
- iOS设备上出现的click,live,on点击失去效果
iOS设备上出现的点击事件失效,但是在Android上可以正常使用, 1.iOS设备对标签点击限制,不认为是可点击的标签,需要给要绑定点击事件的标签加上一个样式,cursor:pointer:这样就可 ...
- KCF的弊端
一.前情提要 如果你对目标跟踪和KCF是什么东西还不了解的话欢迎你看前一篇博文KCF入门详解:https://www.cnblogs.com/jins-note/p/10215511.html ...
- 微信小程序获取Access_token和页面URL生成小程序码或二维码
1.微信小程序获取Access_token: access_token具体时效看官方文档. using System; using System.Collections.Generic; using ...
- Android之使用枚举利弊及替代方案
Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代 使用 Enum 的缺点 每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 Stri ...
- sklearn——数据集调用及应用
忙了许久,总算是又想起这边还没写完呢. 那今天就写写sklearn库的一部分简单内容吧,包括数据集调用,聚类,轮廓系数等等. 自带数据集API 数据集函数 中文翻译 任务类型 数据规模 load_ ...
- VMWare虚拟机安装Linux系统时安装界面显示不全的解决、Linux分区
1.只有最下面的按钮不全(可以显示字的一部分):可以用Tab键操控进行下一步 2.只有一半左右的界面:用Alt+鼠标左键移动安装界面 3.关于Linux分区:如果想用Linux进行深入操作,尽量不要选 ...
- 类Unix上5个最佳开源备份工具 Bacula/Amanda/Backupninja/Backuppc/UrBackup
当为一个企业选择备份工具的时候,你都考虑什么呢? 确定你正在部署的软件具有下面的特性 开源软件 – 你务必要选择那些源码可以免费获得,并且可以修改的软件.确信可以恢复你的数据,即使是软件供应商/项目停 ...
- Spring Cloud 子项目介绍
Spring Cloud由以下子项目组成. Spring Cloud Config 配置中心——利用git来集中管理程序的配置. 项目地址:https://spring.io/projects/spr ...
- Spirng MVC 重定向传递对象
在 Spring MVC 中我们会经常遇到重定向. @RequestMapping("/order/saveorder.html") public String saveOrder ...