带劲的and和

Time Limit: 2000/1000 MS (Java/Others) Memory Limit:65536/65536 K (Java/Others)

Problem Description

度度熊专门研究过“动态传递闭包问题”,他有一万种让大家爆蛋的方法;但此刻,他只想出一道简简单单的题——至繁,归于至简。

度度熊有一张n个点m条边的无向图,第i个点的点权为vi

如果图上存在一条路径使得点i可以走到点j,则称i,j是带劲的,记f(i,j)=1f(i,j)=1f(i,j)=1;否则f(i,j)=0f(i,j)=0f(i,j)=0。显然有f(i,j)=f(j,i)f(i,j)=f(j,i)f(i,j)=f(j,i)。

度度熊想知道求出:
∑i=1n∑j=i+1nf(i,j)∗max(vi,vj)∗(vi&vj)\sum_{i=1}^{n} \sum_{j=i+1}^{n}f(i,j)*max(v_i,v_j)*(v_i\&v_j)i=1∑n​j=i+1∑n​f(i,j)∗max(vi​,vj​)∗(vi​&vj​)
其中&是C++中的and位运算符,如1&3=1, 2&3=2。

请将答案对109+7取模后输出。

Input

第一行一个数,表示数据组数T。

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

数据组数T=50,满足:

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

其中90%的数据满足n,m≤1000。

Output

每组数据输出一行,每行仅包含一个数,表示带劲的and和。

Sample Input

1
5 5
3 9 4 8 9
2 1
1 3
2 1
1 2
5 2

Sample Output

99

题意

有一个点带权的无向图,定义f(i,j),如果存在i到j的路径,则f(i,j)=1f(i,j)=1f(i,j)=1,否则f(i,j)=0f(i,j)=0f(i,j)=0.求对于所有的点对(i,j),∑i=1n∑j=i+1nf(i,j)∗max(vi,vj)∗(vi&vj)\sum_{i=1}^{n} \sum_{j=i+1}^{n}f(i,j)*max(v_i,v_j)*(v_i\&v_j)∑i=1n​∑j=i+1n​f(i,j)∗max(vi​,vj​)∗(vi​&vj​)的和。

题解:

对于答案有贡献的,只有在同一个联通块的两个点才会对答案有贡献,所有可以先求出联通块。对于同一个联通块内的点,如果暴力,n*n是会超时的。分析公式最后的vi&vjv_i \& v_jvi​&vj​,当vi和vj的二进制对应的位都为1时,vi&vjv_i \& v_jvi​&vj​对应位才为1,所以可以将vi,vj,拆分成2a1+2a2+...+2ai2^{a1}+2^{a2}+...+2^{ai}2a1+2a2+...+2ai的形式,对每一部分单独计算。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctype.h>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<iostream>
#include<iterator>
#define dbg(x) cout<<#x<<" = "<<x<<endl;
#define INF 0x3f3f3f3f
#define eps 1e-8using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 100100;
const int mod = 1000000007;
int vis[maxn], a[maxn], v[maxn], col[maxn], sum[50];
LL val[40];
vector<int> g[maxn];
int Find(int x);int main()
{int t, n, m, i, j, k;LL ans;val[0] = 1;for(i=1;i<=30;i++)val[i] = (val[i-1]*2)%mod;scanf("%d", &t);while(t--){int num = 1;ans = 0;scanf("%d %d", &n, &m);for(i=1;i<=n;i++){scanf("%d", &v[i]);a[i] = i, col[i] = -1;g[i].clear();}//并查集,求联通块while(m--){scanf("%d %d", &i, &j);int x = Find(i), y = Find(j);if(x != y)a[x] = y;}for(i=1;i<=n;i++){a[i] = Find(i);if(col[a[i]] == -1)col[a[i]]=num++;g[col[a[i]]].push_back(v[i]);}for(i=1;i<num;i++){memset(sum, 0, sizeof(sum));sort(g[i].begin(), g[i].end());for(j=0;j<30;j++)if(g[i][0] & (1<<j))sum[j]++;//计算当g[i][j]为最大值时,对答案的贡献for(j=1;j<g[i].size();j++){for(k=0;k<30;k++)if(g[i][j] & (1<<k)){ans += (val[k]*sum[k]%mod) * g[i][j]%mod;ans %= mod;sum[k]++;}}}printf("%lld\n", ans);}return 0;
}int Find(int x)
{return a[x]=x==a[x]?x:Find(a[x]);
}

hdu 6411 带劲的and和(并查集、位运算)相关推荐

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

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

  2. HDU 4738 Caocao‘s Bridges(桥、任何位运算一定都要加括号、因为有重边所以用前向星)

    HDU 4738 Caocao's Bridges(桥.任何位运算一定都要加括号.因为有重边所以用前向星) Caocao was defeated by Zhuge Liang and Zhou Yu ...

  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. 2022-2028年中国汽车塑料行业市场深度分析及投资趋势预测报告
  2. 【转载】关于RabbitMQ的消息确认
  3. java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析
  4. Java 5~11各个版本新特性史上最全总结
  5. 学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!附下载链接!...
  6. python 调用不存在的方法 统一处理_提取不重复数据在Excel、SQL与Python中的处理方法...
  7. R语言给图形填充颜色(polygon函数)
  8. 【转】记使用Kali linux 2.0的一些坑
  9. mybatis执行sql脚本
  10. 【京东】会员激励体系,会员体系结构分析
  11. Koo叔说Shader—最基本的Shader
  12. 中式英语如何产生?该怎么办?
  13. LIEF:修改安卓.so后报 dlopen failed:has invalid shdr offset/size
  14. PS操作01 - PS切手机图标 + Android.9.png图片制作
  15. 百度AI入门课-day2作业
  16. 介绍一些新手入门FPGA的优秀网站(新增4)
  17. 投资区块链做到这五步,规避风险!
  18. linux安装搜狗中文,Ubuntu 17.04 安装搜狗中文输入法
  19. 【Codecs系列】几个开源的视频编解码器介绍
  20. 【前端开发】开启鸿蒙系统2.0(华为mate手机)的安卓调试 - 开发者选项 - USB调试

热门文章

  1. 多核环境下的内存屏障指令
  2. 目标检测算法的大体框架-------backbone、head、neck
  3. Centos7上的Ansible管理Windows主机的部署
  4. 跟着猴博士复试概率论(第二部分)
  5. Android开发者进退两难的出路;转行还是进阶?转行转什么最好
  6. 均匀布拉格光栅MATLAB反射谱仿真
  7. Apollo代码学习(二)—车辆运动学模型
  8. python儿童编程培训
  9. EasyX入门和介绍
  10. NLP基础入门:Word2Vec模型