HDU 4705 立方和拆解
HDU 4705 立方和拆解
题意
给一棵树,找出所有的(A,B,C)三元组的数量,满足ABC不能同时被一条路径覆盖
思路
首先可以明确的是,对于每个入度大于等于3的点(也就是有两个或以上儿子的节点),对答案都有贡献,并且这个贡献是任意三个与其相连的部分的权值乘积的加和。(由于每个节点的“分叉位置”不用,所以不会出现重复记录的现象)
也就是说,从根节点(我们取1节点为根)开始,进行到一棵以某节点为根的子树时,设这棵子树权值为 \(q_0\), 而此节点下面的子树权值为 \(q_1, q_2 ··· q_s\), 我们要算的就是
\]
- 但是我们肯定不能n^3来算,这个时候可以模仿序列和的平方化任意两数乘积加和的公式:
\]
来写出序列和的立方化任意三数乘积加和的公式:
\]
这样就可以O(n)搜索算出答案了
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
int vv[200005], nex[200005], fir[100005];
long long sz[100005];
long long ans = 0;
void dfs1(int o, int fa)
{
sz[o] = 1;
for (int i = fir[o]; i; i = nex[i])
{
if (vv[i] != fa)
{
dfs1(vv[i], o);
sz[o] += sz[vv[i]];
}
}
}
void dfs(int o, int fa)
{
long long ext = n - sz[o];
long long c3 = ext * ext * ext;
long long c2 = ext * ext;
long long c1 = ext;
int cnt = 0;
for (int i = fir[o]; i; i = nex[i])
{
if (vv[i] != fa)
{
++cnt;
c3 += sz[vv[i]] * sz[vv[i]] * sz[vv[i]];
c2 += sz[vv[i]] * sz[vv[i]];
c1 += sz[vv[i]];
dfs(vv[i], o);
}
}
if (cnt >= 2)
{
ans += (c1 * c1 * c1 - 3 * c2 * c1 + 2 * c3) / 6;
}
}
int main()
{
while (scanf("%d", &n) == 1)
{
memset(nex, 0, sizeof(int) * (2 * n + 2));
memset(fir, 0, sizeof(int) * (n + 2));
memset(sz, 0, sizeof(long long) * (n + 2));
ans = 0;
for (int i = 1; i < n; ++i)
{
int u;
scanf("%d%d", &u, &vv[i]);
vv[i + n] = u;
nex[i] = fir[u];
fir[u] = i;
nex[i + n] = fir[vv[i]];
fir[vv[i]] = i + n;
}
dfs1(1, 0);
dfs(1, 0);
printf("%lld\n", ans);
}
return 0;
}
HDU 4705 立方和拆解的更多相关文章
- hdu 4705 dfs统计更新节点信息
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 #pragma comment(linker, "/STACK:16777216&qu ...
- hdu 4705(树形DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...
- HDU 4705 Y 树形枚举
树形枚举--搜索 题目描述: 给你一棵树,要在一条简单路径上选3个不同的点构成一个集合,问能构成多少个不同的集合. 解法: 枚举所有结点,假设某个结点有n棵子树,每棵子树的结点个数分别为s1,s2,` ...
- hdu 4705 排列组合
思路:枚举能是A,B,C在一条简单路径上的中点. 计算多少个几何能满足.在用总数减去 #pragma comment(linker, "/STACK:16777216") #inc ...
- HDU 4705 Y
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submis ...
- HDU 4705 Y (2013多校10,1010题,简单树形DP)
Y Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...
- hdu 4705 Y (树形dp)
Description Input 4 1 2 1 3 1 4 题目的意思是给你一棵树,让你找到所有不在一条路径上的三个点的情况个数.乍一看正向处理比较麻烦,我们从反方向考虑,如果是取在一条路径上的3 ...
- hdu 2007 - 平方和与立方和
题目大意: 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. 解答: 坑你没商量!要考虑输入数a,b的大小.如果a>b,需要交换a,b的值. 1: #include<s ...
- (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)
题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- [HDU] 平方和与立方和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2007 //坑:注意判断输入两个数的前后大小关系 // 用while 循环 #include<io ...
随机推荐
- WebKit Insie: Active 样式表
WebKit Inside: CSS 样式表的匹配时机介绍了当 HTML 页面有不同 CSS 样式表引入时,CSS 样式表开始匹配的时机.后续文章继续介绍 CSS 样式表的匹配过程,但是在匹配之前,首 ...
- SQL Server事务及隔离级别
事务的并发操作可能出现的问题 中文 英文 描述 脏读 Dirty Reads 事务2读到了事务1未提交的事务,事务1随后回滚,但事务2读到了事务1的"中间数据". 在Read Un ...
- U盘插入过手机后再拔出来,windows无法识别的解决办法
win键+X,设备管理器. 找到"通用串行总线控制器",大容量USB设备,右键,卸载设备. 拔出U盘,再插入U盘. 就好了. 很明显,U盘插入手机,然后设置里点弹出后再拔,这是很规 ...
- 2007年对Youtube小视频的分析文章
Understanding the Characteristics of Internet Short Video Sharing: YouTube as a Case Study 视频的种类 该研究 ...
- 树莓派4b部署samba服务实现文件共享
注意 samba 生命力很旺盛,软件是在不断更新的, 网上很多针对 samba 网速优化设置截止当前 实测发现有很多已经过期, 甚至有些设置会适得其反,使传输速度更低. 例如, 全网都在配置的参数,& ...
- 关于区间DP的一点点心得(虽然还是很菜)
自己今天对于区间 DP 的一个总结 区间 DP 的数组一般是二维,其状态一般表示区间 \((l,r)\). 区间 DP 在思考的时候是有一定套路的,思考时可以按照如下方式进行思考: 这段区间要维护的信 ...
- Python标准库中隐藏的利器
Python安装之后,其标准库中有的模块,不一定要通过代码来引用,还可以直接在命令行中使用的. 在命令行中直接使用Python标准库的模块,最大的好处就是就是不用写代码,就能使用其中的功能,当临时需要 ...
- 微信小程序敏感内容检测
获取access_token access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保 ...
- Django的staticfiles库
staticfiles 库是 Django 提供的一个用于管理静态文件的库,它提供了一些工具和函数来帮助开发者在 Django 应用程序中管理和提供静态文件服务. 在 Django 应用程序中,静态文 ...
- Echarts 柱形图最全详解
Echarts 是一款基于 JavaScript 的开源可视化图表库,被广泛应用于数据可视化领域.它提供了丰富的图表类型和交互功能,其中柱形图是最常用和重要的一种图表类型之一.下面是对 Echarts ...