稍微建一下模型就可以发现,题目要求的其实是一个最小异或基环森林。。。。

可以用类似最小生成树的拟阵性质来证明,贪心的从小的边权开始依次尝试加入的方法是对的。

所以我们把a[]排完序之后直接递归贪心就行了。。。。

从大的位到小的位考虑,能不选这一位为一的边就不选。

首先如果区间内不存在这一位为1的边的话是可以不选的;如果把区间内这一位为1的数分成两个子区间(一定是一个前缀一个后缀),并且子区间内元素都>2的话,也是可以不选的;

其他情况是要选的,可以根据两边子区间的大小来判断选前几小的边。。。

因为只有一边点数<=2的时候需要 O(左右子区间大小乘积) 的复杂度去计算,所以复杂度是对的。。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=300005;
int n,a[N],T;
ll ans=0; inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} void solve(int o,int l,int r){
if(o<0||l>=r) return;
if(r==l+1) { ans+=a[l]^a[r]; return;} int mid;
for(mid=l;mid<=r&&((a[mid]>>o)&1)==0;mid++); solve(o-1,l,mid-1),solve(o-1,mid,r); if((mid-l>=3&&r-mid>=2)||mid==l||mid>r) return; int M=1<<30,m=1<<30,now;
for(int i=l;i<mid;i++)
for(int j=mid;j<=r;j++){
now=a[i]^a[j];
if(now<M) m=M,M=now;
else if(now<m) m=now;
} if(mid-l<=2&&r-mid<=1) ans+=m+(ll)M;
else ans+=M;
} int main(){
T=read(); while(T--){
n=read(),ans=0;
for(int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+n+1); solve(30,1,n); printf("%lld\n",ans);
} return 0;
}

[Lydsy1805月赛] quailty 算法的更多相关文章

  1. BZOJ5362: [Lydsy1805月赛]quailty 算法

    BZOJ5362: [Lydsy1805月赛]quailty 算法 https://lydsy.com/JudgeOnline/problem.php?id=5362 分析: 题意即求一个最小基环树森 ...

  2. [Lydsy1805月赛]quailty 算法 BZOJ5362

    分析: 题目中描述了一个二分图,让我们求最小权最大匹配,实际上其实是求n个点,在n*(n-1)/2中选n条边的权值和最小,形成一个每个点都有出边的体系,也就是基环树,(证明:因为我们需要二分图最大匹配 ...

  3. BZOJ_5359_[Lydsy1805月赛]寻宝游戏_DP

    BZOJ5359_[Lydsy1805月赛]寻宝游戏_DP Description begin.lydsy.com/JudgeOnline/upload/201805.pdf 我们需要找到一条权值最大 ...

  4. [Bzoj5358][Lydsy1805月赛]口算训练(预处理+动态开点线段树)

    5358: [Lydsy1805月赛]口算训练 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 318  Solved: 105[Submit][Stat ...

  5. [Bzoj5359][Lydsy1805月赛]寻宝游戏(dp)

    5359: [Lydsy1805月赛]寻宝游戏 Time Limit: 2 Sec  Memory Limit: 512 MBSubmit: 71  Solved: 19[Submit][Status ...

  6. BZOJ5361[Lydsy1805月赛]对称数——主席树+随机化

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5361 好神的一道题啊! 容易看出来是要用维护权值的数据结构,因此树链剖分首先pass掉. ...

  7. BZOJ4837:[Lydsy1704月赛]LRU算法(双指针&模拟)

    Description 小Q同学在学习操作系统中内存管理的一种页面置换算法,LRU(LeastRecentlyUsed)算法. 为了帮助小Q同学理解这种算法,你需要在这道题中实现这种算法,接下来简要地 ...

  8. [Lydsy1805月赛]对称数 BZOJ5361

    分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑 ...

  9. [Lydsy1805月赛]口算训练 BZOJ5358

    分析: 没想到这道题还能二分查找... 这题主席树的话,裸的很显然...我们将每一个数分解质因数,之后建一个可持久化权值线段树维护[L,R]区间内的每一种质因子的个数,分解质因数的话,可以选择用线筛, ...

随机推荐

  1. 总有你要的编程书单(GitHub )

    目录 IDE IntelliJ IDEA 简体中文专题教程 MySQL 21分钟MySQL入门教程 MySQL索引背后的数据结构及算法原理 NoSQL Disque 使用教程 Neo4j .rb 中文 ...

  2. Tomcat的安装以及基本配置

    Tomcat是目前最常见也是最流行的基于java的一个web服务器软件   Tomcat的安装   (1)首先需要java环境,也就是说要依赖于java虚拟机JVM   (2)下载Tomcat ,地址 ...

  3. B题 hdu 1407 测试你是否和LTC水平一样高

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1407 测试你是否和LTC水平一样高 Time Limit: 2000/1000 MS (Java/Ot ...

  4. Perl6 Bailador框架(2):路径设置

    use v6; use Bailador; =begin pod get表示是get发送 post表示是post发送 get/post 后面的 '/name' 表示是路径 => sub {} 是 ...

  5. 【DeepLearning学习笔记】Coursera课程《Neural Networks and Deep Learning》——Week2 Neural Networks Basics课堂笔记

    Coursera课程<Neural Networks and Deep Learning> deeplearning.ai Week2 Neural Networks Basics 2.1 ...

  6. python基础===抽象

    懒惰即美德 斐波那契数列: >>> fibs = [0,1] >>> for i in range(8): fibs.append(fibs[-2]+fibs[-1 ...

  7. Android 开发之避免被第三方使用代理抓包

    现象:charles抓不到包,但wireshark,HttpAnalyzor可以抓到包. 关键代码: URL url = new URL(urlStr); urlConnection = (HttpU ...

  8. python中的enumerate获取迭代元素的下标

    以前迭代的时候,需要获取次数都是如下格式: index=1 for node in nodes: if index==3: continue print(node.text_content())ind ...

  9. 用pyperclip 模块拷贝粘贴字符串

    >>> import pyperclip>>> pyperclip.copy('Hello world!')>>> pyperclip.paste ...

  10. c++ 引用的分析

    在一般教材里面,我们会说引用是变量的别名,另外在 c++ primer 5里面说到引用的时候,说引用不是对象,不能对它进行取地址.但是我们来看看下面代码的分析: #include <iostre ...