CF1624G 题解

大水题给我评个 ∗ 1900 ^*1900 ∗1900。

题面

求最小生成树,这次的权值和变成了或和。

也就是说,求 min ⁡ { w 1 or ⁡ w 2 or ⁡ … or ⁡ w n − 1 } \displaystyle\min \{w_1 \operatorname{or} w_2 \operatorname{or} \dots \operatorname{or} w_{n - 1}\} min{w1​orw2​or…orwn−1​}。

题解

二进制最值经典套路:位越高的必须能 0 0 0 就 0 0 0

既然这样, 0 0 0 的条件就是所有的边在这一位下必须为 0 0 0

如果在最高位,有一组边这一位全为 0 0 0 且可以从中挑选出生成树,那么必定选。

那么,不难想出一种用并查集维护的贪心手段:

  • 如果边权的此位为 0 0 0,插入并查集。
  • 如果并查集将所有点连起来(这里面只有一个祖先,即有生成树),那么将未选中并查集的所有边删去。
  • 否则,答案加上这一位,即 ans += (1LL << i)

Talk is cheap, give me the code!

Code

#include <bits/stdc++.h>#define int long long
// FOR templates.
#define rep(i, s, n, k) for(int i = s;i <= n;i += k)
#define repn(i, s, n, k) for(int i = s;i < n;i += k)
#define pre(i, s, n, k) for(int i = s;i >= n;i -= k)
#define pren(i, s, n, k) for(int i = s;i > n;i -= k)
// Abbr for STL.
#define pii pair<int, int>
#define pdd pair<double, double>
#define mpi map<int, int>
#define pii pair<int, int>
#define pdd pair<double, double>
#define vc vector<int>
#define mpp map<int, int>
#define arr(k, n) int k[n]
#define all(v) v.begin(), v.end()
// CIN templates, proven very useful.
#define cn(n) int n;cin >> n
#define cm(n) cin >> n
// Abbr for funcs.
#define pb push_back
#define mset memset
// #define files
using namespace std;
const int MAXN = 0x3f3f3f3fLL;
const int MOD1 = 1000000007LL;
const int MOD2 = 998244353LL;
int d[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
int gcd(int a, int b) {if(b == 0) return a;return gcd(b, a % b);}
inline int lowbit(int x) {return x & (-x);}
inline int lcm(int a, int b) {return a * b / gcd(a, b);}vector<pair<pair<int, int>, int> > ge;
void add_edge(int u, int v, int w){ge.pb(make_pair(make_pair(u, v), w));
}
int fa[200001], ng[200001];
int FindFather(int n){if(fa[n] == n) return n;return fa[n] = FindFather(fa[n]);
}
void Union(int u, int v){fa[FindFather(u)] = FindFather(v);
}signed main(){#ifdef filesfreopen(".in", "r", stdin);freopen(".out", "w", stdout);
#endifios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cn(t); while(t--){cn(n); cn(m);ge.clear();rep(i, 1, n, 1) ng[i] = 0;repn(i, 0, m, 1){cn(u); cn(v); cn(w);add_edge(u, v, w);}int ans = 0;pre(i, 31, 0, 1){vc used;rep(j, 1, n, 1) fa[j] = j;repn(j, 0, m, 1){if(ng[j] || ge[j].second & (1LL << i)){continue;}Union(ge[j].first.first, ge[j].first.second);used.pb(j);}set<int> st;rep(j, 1, n, 1) st.insert(FindFather(j));if(st.size() == 1){int l = 0;repn(j, 0, m, 1){if(used[l] == j) l++;else ng[j] = 1;}}else{ans += (1 << i);}}cout << ans << endl;}return 0;
}/**  things to check*  1.  int overflow or long long memory need*  2.  recursion/array/binary search/dp/loop bounds*  3.  precision*  4.  special cases(n=1,bounds)*  5.  delete debug statements*  6.  initialize(especially multi-tests)*  7.  = or == , n or m ,++ or -- , i or j , > or >= , < or <=*  8.  keep it simple and stupid*  9.  do not delete, use // instead*  10. operator priority*  11. is there anything extra to output?*  12. THINK TWICE CODE ONCE, THINK ONCE DEBUG FOREVER*  13. submit ONCE, AC once. submit twice, WA forever*  14. calm down and you'll get good rank*  15. even a bit wrong scores zero*  16. ...**/

CF1624G 题解相关推荐

  1. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  4. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  5. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  8. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  9. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. mysql 查询某个日期时间段,每天同一时间段的数据
  2. TLS 1.3 Handshake Protocol (下)
  3. 高等数学在计算机中的应用论文1500字,数学论文1500字-高数应用论文大一高数的应用论文字数1500左右 爱问知识人...
  4. Maven教程(3)--Maven导入工程常见问题(编码、MavenArchiver、Lifecycle Mapping、maven install 没有反应)...
  5. C_Free引用链接库
  6. 读书笔记 -《深入理解计算机系统》2.1
  7. 浏览器工作原理与实践学习笔记
  8. instring java_Decode a string in Java
  9. mysql mybatis list循环_mybatis框架,使用foreach实现复杂结果的查询--循环List集合方式...
  10. 诗与远方:无题(五十九)
  11. 【Head First 设计模式】-简单工厂模式读后总结
  12. 自底向上带你逆向解析hibernate联合主键
  13. Java基础知识强化38:StringBuffer类之StringBuffer的添加功能
  14. 限流的简单使用及学习
  15. HIMSS宣布 Healthcare IT News和MobiHealth News的国际扩张
  16. 拼多多关键词的排名是怎么查?拼多多排名规则
  17. 阿尔法蛋机器人tf卡_阿尔法蛋机器人哪款好适合几岁孩子,超能蛋早教机真实效果评测(价格309元)...
  18. Java 虚拟机:Java 内存区域及对象,java 反射面试
  19. 蔚来汽车,科技公司?互联网运营公司?
  20. 怎么学计算机知识竞赛,计算机基础学习知识竞赛题目答案解析.docx

热门文章

  1. 有线桥接,多个路由器共用一个WIFI
  2. 光引发剂主要用途_光引发剂分类及用途.doc
  3. 弄一个html的登录页面,使用HTML写一个简单的跳转登录页面
  4. 20到50之间是3的倍数php,小学三年级奥数-第16讲-数字趣谈(教)
  5. AR Trump2(多卡识别学习)
  6. 梅西夺冠,TikTok跨境卖家如何把握这销售良机?
  7. Apache Flume(1):Apache Flume原理
  8. 部署zabbix监控
  9. 英语口语练习系列-C25-冒险-课堂用语-葬我
  10. 安卓神器MT管理器软件V2.9.8和v2.5.0版本5438