总的来说,

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

但这却是蓝题(问号


题意

题意的理解比较麻烦

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


分析

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

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

证明:

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

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


最后

记得开 long long

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<queue>
  7. #include<algorithm>
  8. #define maxn 5005000
  9. using namespace std;
  10. long long n,m,u[maxn],tot,edge_tot,a,b[maxn],cnt;
  11. long long dfn[maxn],low[maxn],sum,ans,head[maxn],fa[maxn];
  12. struct edge{
  13. long long fr,to,nxt,dis;
  14. }e[maxn*2];
  15. inline void add(long long fr,long long to,long long dis){
  16. e[++edge_tot].to=to;
  17. e[edge_tot].dis=dis;
  18. e[edge_tot].fr=fr;
  19. e[edge_tot].nxt=head[fr];
  20. head[fr]=edge_tot;
  21. }
  22. inline long long Get_Father(long long x){
  23. if(fa[x]==x) return x;
  24. return fa[x]=Get_Father(fa[x]);
  25. }
  26. inline void ys(long long x,long long y){
  27. x=Get_Father(x);
  28. y=Get_Father(y);
  29. if(x!=y);
  30. fa[y]=x;
  31. }
  32. inline bool pd(long long x,long long y){
  33. if(Get_Father(x)==Get_Father(y)) return true;
  34. else return false;
  35. }
  36. inline long long cp(edge a,edge b){
  37. return a.dis>b.dis;
  38. }
  39. int main(){
  40. scanf("%d",&n);
  41. for(long long i=1;i<=n;i++){
  42. scanf("%d",&u[i]);
  43. b[i]=i;
  44. fa[i]=i;
  45. }
  46. for(long long i=1;i<n;i++){
  47. for(long long j=i+1;j<=n;j++){
  48. long long c=u[i]^u[j];
  49. add(i,j,c);
  50. sum++;
  51. }
  52. }
  53. sort(e+1,e+sum+1,cp);
  54. for(long long i=1;i<=sum;i++){
  55. // cout<<e[i].fr<<" "<<e[i].to<<" "<<e[i].dis<<" "<<ans<<endl;
  56. if(!pd(e[i].fr,e[i].to)){
  57. ys(e[i].fr,e[i].to);
  58. ans+=e[i].dis;
  59. cnt++;
  60. }
  61. if(cnt==n-1) break;
  62. }
  63. cout<<ans;
  64. return 0;
  65. }

制作不易,不喜勿喷

P4826的更多相关文章

  1. kruskal 及其应用

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

随机推荐

  1. 多维数组遍历.php

    $a=array('fruits'=>array('a'=>'orange','b'=>'grape','c'=>'apple'),     'numbers'=>arr ...

  2. 【代码周边】MongoDB与Mysql对比以及插入稳定性分析(指定主键的影响)

    在数据库存放的数据中,有一种特殊的键值叫做主键,它用于惟一地标识表中的某一条记录.也就是说,一个表不能有多个主键,并且主键不能为空值. 无论是MongoDB还是MySQL,都存在着主键的定义. 对于M ...

  3. [LeetCode]501. Find Mode in Binary Search Tree二叉搜索树寻找众数

    这次是二叉搜索树的遍历 感觉只要和二叉搜索树的题目,都要用到一个重要性质: 中序遍历二叉搜索树的结果是一个递增序列: 而且要注意,在递归遍历树的时候,有些参数如果是要随递归不断更新(也就是如果递归返回 ...

  4. python保存二维列表到txt文件,读取txt文件里面的数据转化为二维列表

    源码: # 读文件里面的数据转化为二维列表 def Read_list(filename): file1 = open(filename+".txt", "r" ...

  5. JQuery特点:

    轻量级 强大的选择器 出色的DOM封装 可靠的事件处理机制 完善的Ajax 出色的浏览器兼容性 丰富的插件支持 完善的文档 支持链式操作

  6. Redis底层数据结构实现

    REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下 ...

  7. maven版本仲裁原则

    这里有一个案例是项目里依赖了b组件,b组件依赖了a组件1.0.2版本,而用户也直接在pom依赖了a组件并声明的1.0.0版本,结果在仲裁时选择了1.0.0版本的a组件: +- com.xxx:a:ja ...

  8. 手动修复 under-replicated blocks in HDFS

    解决方式步骤: 1.进入hdfs的pod kubectl get pod -o wide | grep hdfs kubectl exec -ti hadoop-hdfs-namenode-hdfs1 ...

  9. VMware虚拟机安装黑群晖DSM6.2 (转)

    安装DSM6.2.和安装5.1的过程大致相同,只是在虚拟机的配置时有所不同. 需要用到的工具 Roadkil's Disk Image – 写镜像工具:http://www.roadkil.net/p ...

  10. gitlab git仓库地址修改后更新方法

    背景 由于gitlab地址修改后导致本地仓库的远程仓库失效 解决办法 直接修改本地的远程仓库地址 - 进入项目地址git remote -v 查看旧地址 - 更新指令 git remote set-u ...