题意概况

题目描述

\(Bessie\)和她的朋友们正在一年一度的\(Superbull\)锦标赛中打球,而\(Farmer John\)负责让比赛尽可能激动人心。

总共有 \(N\) 支队伍 \(1 \le N \le 2000\) 参加了\(Superbull\)锦标赛。每个团队都有一个 \(1 \dots 2^{30}-1\)的团队ID。

\(Superbull\)是一场淘汰赛 - 在每场比赛之后,\(FJ\)选择淘汰其中一支球队,而被淘汰的球队再也无法参加任何比赛了。当只剩下一支球队时,比赛就结束了。

\(FJ\)注意到一个不寻常的事情:在任何游戏中,两个团队的总分是两个团队ID的按位异或(XOR)。

例如,如果第 \(12\) 队和第 \(20\) 队将参加比赛,则该游戏的得分为 \(24\) 分,因为\({01100} \quad xor \quad {10100} = {11000}\)

FJ想要设计一种比赛方案,让所有比赛的得分总和最大。请帮助\(Farmer John\)组织比赛。

输入输出格式

输入格式:第一行包括一个整数 \(N\) ,下面 \(N\) 行每行包括一个队伍的ID。

输出格式:输出一个整数,代表比赛的最大总得分。

样例解释

让 \(3\) 队与 \(9\) 队进行比赛,并让 \(9\) 队晋级。

然后他让 \(6\) 队和 \(9\) 队对决,让\(6\)队获胜。

最后,第 \(6\) 队和第 \(10\) 队比赛,\(10\)队获胜。

总得分为:\(3 \quad xor \quad 9+6 \quad xor \quad 9+6 \quad xor \quad 10=10+15+12=37。\)

样例输入

  1. 4
  2. 3
  3. 6
  4. 9
  5. 10

样例输出

  1. 37

数据范围

\(1 \le N \le 2000\)

解题报告

题意理解

  1. 给定\(n\)个人,比\(n-1\)场比赛

  2. 对于一场比赛的精彩度是两个比赛队伍的编号异或

  3. 要求所有的比赛的精彩度之和最大.

算法解析

首先,这道题目难在建图上面.

我们可以分析一下,这道题目的比赛模式.

这就是一场竞赛的四场比赛的形式.

我们发现

  1. 一共比了\(n-1\)场比赛,有\(n\)个人,呈现,树形结构
  2. 对于一场比赛,谁赢谁输并没有什么影响.
  3. 我们要求这些边权最大,且只能有\(n-1\)条边
  4. 一条边的边权,是两点编号的异或.

综上所述,我们可以使用最小生成树的变形,最大生成树来求解本题.


代码解析

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=2010;
  4. int a[N],n,m,cnt,fa[N];
  5. struct node
  6. {
  7. int x,y,w;
  8. } g[N*N];
  9. int cmp(node a,node b)//最大排序
  10. {
  11. return a.w>b.w;
  12. }
  13. inline int find(int x)
  14. {
  15. return fa[x]==x?x:fa[x]=find(fa[x]);
  16. }
  17. inline void kruskal()
  18. {
  19. for(int i=1; i<=n; i++)//建立图
  20. for(int j=1; j<=n; j++)
  21. if (i!=j)
  22. g[++cnt]= {i,j,a[i]^a[j]};//边权为异或
  23. sort(g+1,g+1+cnt,cmp);//kruskal排序
  24. int cc=0;
  25. long long ans=0ll;//记得开long long
  26. for(int i=1; i<=cnt; i++)
  27. {
  28. int x=find(g[i].x),y=find(g[i].y);
  29. if (x==y)//已经联合
  30. continue;
  31. fa[x]=y;
  32. ans+=g[i].w;
  33. if (cc==n-1)//n-1条边凑齐了
  34. break;
  35. }
  36. printf("%lld\n",ans);
  37. }
  38. inline void init()
  39. {
  40. scanf("%d",&n);
  41. for(int i=1; i<=n; i++)
  42. scanf("%d",&a[i]),fa[i]=i;
  43. kruskal();
  44. }
  45. signed main()
  46. {
  47. init();
  48. return 0;
  49. }

[USACO15FEB]Superbull 超级牛的更多相关文章

  1. APT和它的超级牛力

    当你在使用apt时,例如“apt -h”会提示“本APT具有超级牛” 先把牛放一放,先学习以下关于APT的知识. APT 高级打包工具(英语:Advanced Packaging Tools,缩写为A ...

  2. IntelliJ IDEA 15款 神级超级牛逼插件推荐(超赞,谁用谁知道)

    满满的都是干货  所有插件都是在 ctrl+alt+s 里的plugins 里进行搜索安装 1.CodeGlance 代码迷你缩放图插件 2. Codota 代码提示工具,扫描你的代码后,根据你的敲击 ...

  3. 温故而知新 css + html 超级牛逼的居中策略

    该方法甚至可以解决img内容居中的问题 套路:最外层div宽度为居中内容所占的宽度(通常是1170px),并且使其居中(margin:auto) 里层的div宽度为全屏(通常是1920px;)再mar ...

  4. hibernate 超级牛x的公共类

    想法,能支持in查询和 =查询的 公共方法,类似下面实现 用 泛型 实现 参数 getList(String[] params,Object[] values){} for(int i=0;i< ...

  5. 发现XMind一个超级牛逼的功能

    本来想要自己手动建立下文件夹的结构图,一不小心发现了一个大惊喜. 比如想要看一下360Downloads文件夹下的文件结构,可以先创建一个名叫360Downloads的主节点,然后把其文件夹下的文件直 ...

  6. 洛谷P3122 [USACO15FEB]圈住牛Fencing the Herd(计算几何+CDQ分治)

    题面 传送门 题解 题目转化一下就是所有点都在直线\(Ax+By-C=0\)的同一侧,也就可以看做所有点代入\(Ax+By-C\)之后的值符号相同,我们只要维护每一个点代入直线之后的最大值和最小值,看 ...

  7. [USACO15FEB]Superbull (最小生成树)

    题目链接 Solution 基本上就是个板子. 因为 \(n\) 很小,只有 \(2000\),所以直接暴力建图,然后跑最小生成树就好了. Code #include<bits/stdc++.h ...

  8. 超级牛X的免费开源小工具之tldr

    github介绍:http://tldr-pages.github.io/ github源码:https://github.com/tldr-pages/tldr 什么是tldr? 新命令行世界?还是 ...

  9. js 模板引擎 - 超级强大

    本来没想写这篇文章,但是网上误导大众的文章太多了,所以今天就抽出半小时时间谈一下我对前端模板引擎的感受吧. 前端模板引擎相信大家都再熟悉不过了,市面上非常多的号称最好.最快.最牛逼的,随便就能找到一大 ...

随机推荐

  1. imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数

    BW = imregionalmax(I): 该函数获得灰度图像 I 的局部极大值,返回值BW为和原图像大小相同的二值图像,BW中元素1对应极大值,其他元素为0 BW = imregionalmax( ...

  2. MSSQL 获取数据库、表、字段信息语句

    --获取所有数据库名称 SELECT Name FROM Master..SysDatabases ORDER BY Name --获取库里所有表名 SELECT * FROM SysObjects ...

  3. 码云、coding拉取项目代码

    1.git init 2.git remote add origin "你的码云或coding项目地址(ssh或https)" 3.git pull origin master

  4. openat与open的区别及用法示例

    从2.6.16版本开始,GNU/Linux引入opeant系统调用: #define _XOPEN_SOURCE 700 /* Or define _POSIX_C_SOURCE >= 2008 ...

  5. [Cometoj#3 C]子序列子序列子序列..._动态规划_数论

    子序列子序列子序列... 题目链接:https://cometoj.com/contest/38/problem/C?problem_id=1542 数据范围:略. 题解: 神仙题,感觉这个题比$D$ ...

  6. axios对请求各种异常情况处理的封装

    前端网络请求封装 前端采用了axios来处理网络请求,为了避免在每次请求时都去判断各种各样的网络情况,比如连接超时.服务器内部错误.权限不足等等不一而足,我对axios进行了简单的封装,这里主要使用了 ...

  7. 在django中进行后台管理时插入外键数据时不显示值的问题

    在django的后台管理站点插入数据时,发现需要添加外键时,下拉框中不显示值 按照显示内容中的object,考虑这里应该是调用的模型类的objects对象方法,那么去models.py中对模型类添加一 ...

  8. Kubernetes---Pod状态示例

    ⒈Pod 中只有一个容器并且正在运行,容器成功退出 ·记录事件完成  ·如果restartPolicy为:  Always:重启容器:Pod phase仍为Running  OnFailure:Pod ...

  9. 有关带scala版本的eclipse4.7的下载

    有关带scala版本的eclipse4.7的下载, 你可以直接去: http://scala-ide.org/download/sdk.html ​ 下载下来后是:scala-SDK-4.7.0-vf ...

  10. Symfony 服务配置 看这一篇就够了

    对于刚接触 Symfony 的新手来说,如何配置服务是一件很困难的事情.虽然在 Symfony 的新版本的框架中加入了自动加载(autowire),基本上满足了一般的需求,但是如果你想深入了解“服务” ...