HDU 6411 带劲的and和;
分析:写了好久了,突然想补一下博客。。。
公式看完过后,就是求一个联通图内任意两点之间的max(vi,vj)×(vi&vj)。直观感受是n*n的做法,从枚举贡献的角度出发。对于任意的vi,它所带来的贡献是:1,比它小的vj的max(vi,vj)=vi,(vi&vj)=排序后的二进制累加和;2,比它小的vj的max(vi,vj)=vj,对应的vi二进制位累加,对之后的vj进行贡献;
你把一个联通图的节点权值用二进制表示画出来,考虑二进制贡献。

#pragma GCC optimize ("O3")
#pragma GCC optimize ("O2")
#include <bits/stdc++.h>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
#define met(s) memset(s, 0, sizeof(s))
#define rep(i, a, b) for(int i = a; i <= b; ++i)
template <class T> inline void scan_d(T &ret) {
char c; ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9') {
ret = ret * 10 + (c - '0'), c = getchar();}}
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int MAXN = 1e5 + 10;
vector<int> G[MAXN], V[MAXN];
int dp[35], vi[MAXN], vis[MAXN];
int p;inline void dfs(int x) {V[p].push_back(vi[x]);for(int i = 0; i < G[x].size(); ++i) {int u = G[x][i];if(vis[u]) continue;vis[u] = 1;dfs(u);}
}inline void init() {for(int i = 0; i < MAXN; ++i) G[i].clear(), V[i].clear();memset(vis, 0, sizeof(vis));
}int main() {int T;scanf("%d", &T);while(T--) {int n, m; init();scanf("%d %d", &n, &m);for(int i = 1; i <= n; ++i) scanf("%d", &vi[i]);for(int i = 1; i <= m; ++i) {int u, v;scanf("%d %d", &u, &v);G[u].push_back(v);G[v].push_back(u);}p = 0;for(int i = 1; i <= n; ++i) {if(vis[i]) continue;vis[i] = 1;dfs(i);sort(V[p].begin(), V[p].end());p++;}LL ans = 0;for(int i = 0; i < p; ++i) {memset(dp, 0, sizeof(dp));for(int j = 0; j < V[i].size(); ++j) {int u = V[i][j];for(int k = 0; k <= 30; ++k) {if((1 << k) & u) {ans += (1 << k) * 1LL * u % mod * 1LL * dp[k];ans %= mod;dp[k]++;}}}}printf("%lld\n", ans % mod);}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和

    题目传送门 代码: #include<bits/stdc++.h> using namespace std;typedef long long LL; const int maxn=100 ...

  3. 【HDU 6411】带劲的and和 【并查集 + 二进制拆位】

    度度熊专门研究过"动态传递闭包问题",他有一万种让大家爆蛋的方法:但此刻,他只想出一道简简单单的题--至繁,归于至简 度度熊有一张n个点m条边的无向图,第i个点的点权为viviv_ ...

  4. hdu 5099 Comparison of Android versions 枚举题意

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5099 卡读题,实际上题目中表述的题意并不完整,所以要认真读并且加上一些现实的"常识" ...

  5. hdu 5563 Clarke and five-pointed star (枚举)

    题意:给出5个点的坐标,问这5个点是否刚好是一个五角星的顶点. 思路: dfs枚举5个点的顺序. 判断5条邻边相等,5条对角线相等.若均满足则是,否则不是. 附:为什么要判断5条对角线也相等才行呢? ...

  6. HDU 5025Saving Tang Monk BFS + 二进制枚举状态

    3A的题目,第一次TLE,是因为一次BFS起点到终点状态太多爆掉了时间. 第二次WA,是因为没有枚举蛇的状态. 解体思路: 因为蛇的数目是小于5只的,那就首先枚举是否杀死每只蛇即可. 然后多次BFS, ...

  7. 【HDU - 1172】猜数字 (枚举暴力)

    题干: 猜数字游戏是gameboy最喜欢的游戏之一.游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么.每猜一个数,计算机都会告诉玩家猜对几个数字,其中有几个数字在正确的位置上. ...

  8. hdu 2489 Minimal Ratio Tree (DFS枚举+MST)

    参考链接:http://blog.csdn.net/xingyeyongheng/article/details/9373271 http://www.cnblogs.com/chenxiwenruo ...

  9. HDU 4379 The More The Better [枚举]

    枚举统计所有<=L/2的数,在找到是否存在一个>L/2的数使所有其它数加上它都不大于L即可. 注意枚举的时候把模运算进行转化. 1 #include <stdio.h> 2 # ...

最新文章

  1. vim 编写python代码_用Vim编写Python代码
  2. 构造函数中不应调用虚函数
  3. Jconsole配置与连接
  4. Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条
  5. SSL4MIS:医学图像半监督分割的Baselines
  6. 记一次高io wait问题分析及解决-设置合理的SGA
  7. 【深入】java 单例模式
  8. ETH突破620美元关口 日内涨幅为5.36%
  9. SPOJ KPSUM ★(数位DP)
  10. 2030中国足球称霸世界
  11. SAP CO T-Code
  12. ValueError: Format specifier missing precision
  13. Centos7文本处理工具
  14. 《科研诚信与学术规范》
  15. Python地理位置信息库geopy的使用(一):基本使用
  16. 高手都具备“向下兼容”的能力
  17. 设计模式-鸭子类型1
  18. Makefile编写和使用技巧
  19. 哈哈!12万行代码堆出来个「蔡徐坤」
  20. python疲劳检测代码_【君奉天|开发日记】疲劳驾驶检测

热门文章

  1. 这次彻底读透 Redis
  2. Mysql:Got error 28 from storage engine
  3. Qt 编程指南 8 显示静态小图片和动态大图片
  4. java 国际化_Java国际化基础
  5. matlab标定工具箱标定投影仪常见问题
  6. 2021-10-09
  7. android绘制view的撤销,DrawingView android 上的一个涂鸦控件。可以设置画笔的粗细,颜色,撤销上一笔涂鸦,提供保存图片的接口。 @codeKK Android开源站...
  8. caffe 人脸关键点检测_密集人脸关键点检测
  9. Boot Loader 的设计与实现
  10. 驰骋工作流引擎-督查督办系统