hdu 6411 带劲的and和(并查集、位运算)
带劲的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∑nj=i+1∑nf(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+1nf(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和(并查集、位运算)相关推荐
- HDU 6411 带劲的and和【枚举贡献】
HDU 6411 带劲的and和: 分析:写了好久了,突然想补一下博客... 公式看完过后,就是求一个联通图内任意两点之间的max(vi,vj)×(vi&vj).直观感受是n*n的做法,从枚举 ...
- HDU 4738 Caocao‘s Bridges(桥、任何位运算一定都要加括号、因为有重边所以用前向星)
HDU 4738 Caocao's Bridges(桥.任何位运算一定都要加括号.因为有重边所以用前向星) Caocao was defeated by Zhuge Liang and Zhou Yu ...
- HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 1213 How Many Tables(并查集模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...
- HDU 3047 Zjnu Stadium (带权并查集)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3047 题目: Problem Description In 12th Zhejiang College ...
- hdu 1272 小希的迷宫 (并查集)
小希的迷宫 Time Limit: 2000/1000 ...
- HDU 1325 Is It A Tree? 并查集
点击打开链接 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- HDU 3081 Marriage Match II【并查集+二分图最大匹配】
大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...
- HDU - 5176 The Experience of Love(并查集)
题目链接:点击查看 题目大意:给出一棵边权树,现在要求任意两点之间:最大权值的边减去最小权值的边之和 题目分析:第一步可以先将公式转换一下:,这样问题就转换为了如何求任意两点之间的最大(最小)权值之和 ...
最新文章
- 2022-2028年中国汽车塑料行业市场深度分析及投资趋势预测报告
- 【转载】关于RabbitMQ的消息确认
- java fft 频谱算法_快速傅里叶变换(FFT)算法原理及代码解析
- Java 5~11各个版本新特性史上最全总结
- 学习TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!附下载链接!...
- python 调用不存在的方法 统一处理_提取不重复数据在Excel、SQL与Python中的处理方法...
- R语言给图形填充颜色(polygon函数)
- 【转】记使用Kali linux 2.0的一些坑
- mybatis执行sql脚本
- 【京东】会员激励体系,会员体系结构分析
- Koo叔说Shader—最基本的Shader
- 中式英语如何产生?该怎么办?
- LIEF:修改安卓.so后报 dlopen failed:has invalid shdr offset/size
- PS操作01 - PS切手机图标 + Android.9.png图片制作
- 百度AI入门课-day2作业
- 介绍一些新手入门FPGA的优秀网站(新增4)
- 投资区块链做到这五步,规避风险!
- linux安装搜狗中文,Ubuntu 17.04 安装搜狗中文输入法
- 【Codecs系列】几个开源的视频编解码器介绍
- 【前端开发】开启鸿蒙系统2.0(华为mate手机)的安卓调试 - 开发者选项 - USB调试