51Nod 算法马拉松18 复杂度分析 二进制按位累计代价
来源:互联网 发布:自动计算工资软件 编辑:程序博客网 时间:2024/06/05 16:23
题目大意
给出一棵
即计算
解题思路
由于是计算二进制中1的个数,我们可以按位来求贡献。考虑在找
现在的问题就是统计状态
程序
//YxuanwKeith#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long LL;const int MAXN = 1e5 + 5, MAXM = 20;int N, top, F[MAXN][20], Fa[MAXN][20], Size[MAXN], Deep[MAXN], D[MAXN];int tot, Last[MAXN], Next[MAXN * 2], Go[MAXN * 2];LL Ans;void Link(int u, int v) { Next[++ tot] = Last[u], Last[u] = tot, Go[tot] = v;}void Dfs(int Now, int Pre) { Fa[Now][0] = Pre, Size[Now] = 1, Deep[Now] = Deep[Pre] + 1; for (int p = Last[Now]; p; p = Next[p]) { int v = Go[p]; if (v == Pre) continue; Dfs(v, Now); Size[Now] += Size[v]; }}int Son(int fa, int Now) { for (int i = 19; i + 1; i --) if (Deep[Fa[Now][i]] > Deep[fa]) Now = Fa[Now][i]; return Now;}void Get(int Now, int Pre) { D[Deep[Now]] = Now; for (int p = Last[Now]; p; p = Next[p]) { int v = Go[p]; if (v == Pre) continue; Get(v, Now); } F[Now][19] ++; for (int i = 0; i < 20; i ++) { int fa = Fa[Now][i]; if (!fa) break; for (int j = i + 1; j < 20; j ++) { if (!F[Now][j]) continue; int top = (!Fa[fa][i]) ? 1 : D[Deep[Fa[fa][i]] + 1]; int Siz = Size[top] - Size[D[Deep[fa] + 1]]; Ans += 1ll * Siz * F[Now][j]; F[fa][i] += F[Now][j]; } }}void Prepare() { for (int j = 1; j < 20; j ++) for (int i = 1; i <= N; i ++) Fa[i][j] = Fa[Fa[i][j - 1]][j - 1];}int main() { scanf("%d", &N); for (int i = 1; i < N; i ++) { int u, v; scanf("%d%d", &u, &v); Link(u, v), Link(v, u); } Dfs(1, 0); Prepare(); Get(1, 0); printf("%lld\n", Ans);}
1 0
- 51Nod 算法马拉松18 复杂度分析 二进制按位累计代价
- [51nod]算法马拉松18 总结
- 51nod算法马拉松18总结
- 51nod 算法马拉松12
- 51nod算法马拉松20
- 51Nod 算法马拉松23
- 51Nod 算法马拉松24
- 51nod算法马拉松25
- 【51Nod算法马拉松18 A】染色问题
- 【51Nod算法马拉松18 B】非010串
- 【51Nod算法马拉松18 C】数值计算
- 51nod 算法马拉松 集合计数
- 51nod 算法马拉松11 D 计算
- 51nod 算法马拉松12 逛街(treap)
- 51nod 算法马拉松19 A P1674
- 51nod算法马拉松19总结
- 【51nod】算法马拉松19 总结
- 51nod算法马拉松20总结
- 简单的实现人物的移动,跳跃,视角的转动等
- Add Two Numbers
- 移动前端的开发须知
- 数据库系统概论学习笔记关系数据库 第二章
- C语言求两个数的最大公约数
- 51Nod 算法马拉松18 复杂度分析 二进制按位累计代价
- 理解OAuth2.0
- 从最简单的IO驱动看出工程师的水平
- 【洛谷 2016】战略游戏 树形dp经典题目(类似没有上司的舞会)
- JavaScript
- java and python学习——第四周leetcode刷题
- React Native 切换监听端口(Android)
- D3_函数
- 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个?