总的来说,

这道题只考查了单纯的建图和最大生成树

但这却是蓝题(问号


题意

题意的理解比较麻烦

简单说就是 n 支队伍比赛,i 号队伍和 j 号队伍比赛可获得 i ^ j 的分数,然后其中一支队伍会输,退出比赛,问当场上只有一支队伍的时候分数最大是多少


分析

这么看似乎比较麻烦,那我们转化一下:

  • i 号队伍和 j 号队伍比赛可以看做从 i 向 j 连了一条边,边权就是 i ^ j
  • 其中一支队伍会输,退出比赛,也就是不能出现环
  • 求最大分数也就是在剩下的无环图中找出最大的 n - 1 条边的权值和

证明:

如果可以出现环,那么输掉的球队就可以再次进行比赛,也就是说没有输掉的球队了,而且这样得分也会重复累加

这样我们就可以看出这就是求一个最大生成树的树边和


最后

记得开 long long

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<algorithm>
#define maxn 5005000 using namespace std; long long n,m,u[maxn],tot,edge_tot,a,b[maxn],cnt;
long long dfn[maxn],low[maxn],sum,ans,head[maxn],fa[maxn]; struct edge{
long long fr,to,nxt,dis;
}e[maxn*2]; inline void add(long long fr,long long to,long long dis){
e[++edge_tot].to=to;
e[edge_tot].dis=dis;
e[edge_tot].fr=fr;
e[edge_tot].nxt=head[fr];
head[fr]=edge_tot;
} inline long long Get_Father(long long x){
if(fa[x]==x) return x;
return fa[x]=Get_Father(fa[x]);
} inline void ys(long long x,long long y){
x=Get_Father(x);
y=Get_Father(y);
if(x!=y);
fa[y]=x;
} inline bool pd(long long x,long long y){
if(Get_Father(x)==Get_Father(y)) return true;
else return false;
} inline long long cp(edge a,edge b){
return a.dis>b.dis;
} int main(){
scanf("%d",&n);
for(long long i=1;i<=n;i++){
scanf("%d",&u[i]);
b[i]=i;
fa[i]=i;
}
for(long long i=1;i<n;i++){
for(long long j=i+1;j<=n;j++){
long long c=u[i]^u[j];
add(i,j,c);
sum++;
}
} sort(e+1,e+sum+1,cp); for(long long i=1;i<=sum;i++){
// cout<<e[i].fr<<" "<<e[i].to<<" "<<e[i].dis<<" "<<ans<<endl;
if(!pd(e[i].fr,e[i].to)){
ys(e[i].fr,e[i].to);
ans+=e[i].dis;
cnt++;
}
if(cnt==n-1) break;
}
cout<<ans;
return 0;
}

制作不易,不喜勿喷

P4826的更多相关文章

  1. kruskal 及其应用

    kruskal 最小生成树 kruskal 是一种常见且好理解的最小生成树(MST)算法. 前置知识 并查集和路径压缩 生成树 在有 n 的顶点的无向图中,取其中 n-1 条边相连,所得到的树即为生成 ...

随机推荐

  1. Access denied for user ''@'localhost' to database 'mysql'问题

    Access denied for user ''@'localhost' to database 'mysql'问题 MySQL : Access denied for user ''@'local ...

  2. java中给某个字段加锁

    private String buildLock(String str) { StringBuilder sb = new StringBuilder(str); String lock = sb.t ...

  3. 【Java并发编程】阿里最喜欢问的几道线程池的面试题?

    引言 上一篇文章我们有介绍过线程池的一个基本执行流程<[Java并发编程]面试必备之线程池>以及它的7个核心参数,以及每个参数的作用.以及如何去使用线程池 还留了几个小问题..建议看这篇文 ...

  4. 【Go】我与sync.Once的爱恨纠缠

    原文链接: https://blog.thinkeridea.com/202101/go/exsync/once.html 官方描述 Once is an object that will perfo ...

  5. 多媒体开发(4):在视频上显示文字或图片--ffmpeg命令

    小白:我录了段视频,里面用的音乐是有版权的,而且快过期了,能把音乐去掉吗? 小程拿到视频后,一个快捷键打开命令终端,快速打下一行命令: ffmpeg -i 小白.flv -vcodec copy -a ...

  6. Android基本组件TextView和EditView

    1.TextView 用于在屏幕上显示文本,可以显示单行文本,多行文本,和带图像的文本. 常用xml属性 (1)android:autoLink,用于指定是否将指定的文本转换为可单机的超链接形式,其属 ...

  7. 2021升级版微服务教程—为什么会有微服务?什么是SpringCloud?

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  8. Redis学习之路(二)Redis集群搭建

    一.Redis集群搭建说明 基于三台虚拟机部署9个节点,一台虚拟机三个节点,创建出4个master.4个slave的Redis集群. Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式) ...

  9. Spark RDD批量写入Hbase

  10. LeetCode344 反转字符串

    编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh" 示例 2: 输入: "A man, a p ...