度度熊专门研究过“动态传递闭包问题”,他有一万种让大家爆蛋的方法;但此刻,他只想出一道简简单单的题——至繁,归于至简
度度熊有一张n个点m条边的无向图,第i个点的点权为viviv_i。
如果图上存在一条路径使得点i可以走到点j,则称i,j是带劲的,记f(i,j)=1;否则f(i,j)=0。显然有f(i,j)=f(j,i)。
度度熊想知道求出:
∑n−1i=1∑nj=i+1f(i,j)×max(vi,vj)×(vi&vj)∑i=1n−1∑j=i+1nf(i,j)×max(vi,vj)×(vi&vj)\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} f(i,j) \times \max(v_i, v_j) \times (v_i \& v_j)
其中&是C++中的and位运算符,如1&3=1, 2&3=2。
请将答案对109+7109+710^9+7取模后输出。
第一行一个数,表示数据组数T。

每组数据第一行两个整数n,m;第二行n个数表示vi;接下来m行,每行两个数u,v,表示点u和点v之间有一条无向边。可能有重边或自环。

数据组数T=50,满足:

  • 1≤n,m≤100000
  • 1≤vi≤109。

其中90%的数据满足n,m≤1000。
每组数据输出一行,每行仅包含一个数,表示带劲的and和。
Input
1
5 5
3 9 4 8 9
2 1
1 3
2 1
1 2
5 2
OutPut
99
分析:这个很奇怪的公式,一看就知道要对其化简,不然太难解了,首先第一个f(i,j)f(i,j)f(i,j) 这个好解决,我们可以并查集维护在同一个联通快内的所有点,再看第二个max(vi,vj)max(vi,vj)max(v_i, v_j) ,这个的话,我们可以将每个联通快内的所有点排个序,贡献的传递关系就很明确了,最难的是第三个公式v_i & v_j ,真想不到怎么处理不同数&之间没有任何关系,这个怎么优化? 好吧,看了题解感觉太巧妙了。我么可以利用二进制拆位,拿一个例子来说:
a * b, 假设b的二进制位11011,那么这个乘积也可以转化为a * (1 << 4) + a * (1 << 3) + a * 0 + a * (1 << 1) + a * ( 1 << 0)
把这个思路用到这个题目上,对于同一联通块内的所有点,我们排好序(由小到大)之后,每个值我们都进行拆位,看当前位会对后面比它大的数的贡献。
代码

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
const int MOD = (int) 1e9 + 7;
const int N = (int) 1e5 + 11;int pre[N], val[N]; vector<int>ve[N];
int Find(int x){ return x == pre[x] ? x : (pre[x] = Find(pre[x])); }
int main(){#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);#endifint T; scanf("%d", &T);while(T--){int n, m; scanf("%d%d", &n, &m);for(int i = 1; i <= n; i++){ve[i].clear(); pre[i] = i;}for(int i = 1; i <= n; i++) scanf("%d", &val[i]);while(m--){static int a, b;   scanf("%d%d", &a, &b);a = Find(a); b = Find(b);pre[a] = b;}for(int i = 1; i <= n; i++) ve[Find(i)].push_back(val[i]);for(int i = 1; i <= n; i++) sort(ve[i].begin(), ve[i].end());ll dp[33]; ll ans = 0;  for(int i = 1; i <= n; i++){if(ve[i].size() <= 1) continue; memset(dp, 0, sizeof(dp));for(int k = 0; k < (int)ve[i].size(); k++){int v = ve[i][k];for(int j = 0; j < 30; j++){if(v & (1 << j)) {ans += dp[j] * 1ll * v % MOD * (1 << j) % MOD; ans %= MOD;     dp[j]++; if(dp[j] >= MOD) dp[j] -= MOD;    }}}}printf("%lld\n", ans);}return 0;
}

【HDU 6411】带劲的and和 【并查集 + 二进制拆位】相关推荐

  1. hdu 6411 带劲的and和(并查集、位运算)

    带劲的and和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit:65536/65536 K (Java/Others) Problem Desc ...

  2. HDU 6411 带劲的and和【枚举贡献】

    HDU 6411 带劲的and和: 分析:写了好久了,突然想补一下博客... 公式看完过后,就是求一个联通图内任意两点之间的max(vi,vj)×(vi&vj).直观感受是n*n的做法,从枚举 ...

  3. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  5. HDU 3047 Zjnu Stadium (带权并查集)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3047 题目: Problem Description In 12th Zhejiang College ...

  6. hdu 1272 小希的迷宫 (并查集)

    小希的迷宫                                                                          Time Limit: 2000/1000 ...

  7. HDU 1325 Is It A Tree? 并查集

    点击打开链接 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  8. HDU 3081 Marriage Match II【并查集+二分图最大匹配】

    大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...

  9. HDU - 5176 The Experience of Love(并查集)

    题目链接:点击查看 题目大意:给出一棵边权树,现在要求任意两点之间:最大权值的边减去最小权值的边之和 题目分析:第一步可以先将公式转换一下:,这样问题就转换为了如何求任意两点之间的最大(最小)权值之和 ...

最新文章

  1. 2017-2-19 C#基础 基本数据类型的转换,转义字符,常量
  2. ClickHouse【资源分享 01】Linux环境 clickhouse-19.7.3.9 离线安装文件分享(百度云盘)
  3. 《构建实时机器学习系统》一1.8 实时机器学习模型的生存期
  4. 低成本DIY视频预览遥控小车
  5. drools动态配置规则_关于规则引擎
  6. Maven本地库添加Oracle JDBC驱动
  7. C/C++获取本地IP(适用于多种操作系统)
  8. spark学习-SparkSQL-SparkSession与SparkContext
  9. 如何让vim支持python_无法使vim支持python
  10. 数字图像识别笔记(第一章绪论)
  11. ultraedit查找每行第二个单词_算法4th3:查找
  12. mark制图软件_绘图软件有哪些?
  13. 海王星 :谈中国共享软件的发展
  14. Generative Face Completion
  15. wd ex2 ultra mysql_西部数据My Cloud EX2网络存储器驱动
  16. java中的g1_G1GC 概念与性能调优
  17. 微信小程序订阅消息开发教程及代码(java后端实现)
  18. Unable to launch the Java Virtual Machine Located at path
  19. 脉脉热帖:学历、履历双造假,拿了抖音Offer
  20. linux图形加速驱动下载,Linux 安装emby 并开启nvidia nvenc 硬件加速转码

热门文章

  1. 玩自动阅读,100部手机去操作,一天可以赚1200?揭秘背后的故事
  2. ffmpeg 连接抖音三个视频,做电脑桌面
  3. web常见的攻击方式有哪些,以及如何进行防御?
  4. 华为设备如何查看风扇的序列号?
  5. 无法完成压缩(zipped)文件来提取向导,怎么解决
  6. VBA程序升级,vba在线更新
  7. 汉语拼音大全(竖排版)
  8. excel应用技巧:F功能键诸多应用汇总
  9. python pyqt5 股票分时_pythonpyqt5股票分时:股票风险与提示_XAC配资之家
  10. h5+js+ajax+百度翻译API:实现翻译功能