HDU 4705 立方和拆解

题意

给一棵树,找出所有的(A,B,C)三元组的数量,满足ABC不能同时被一条路径覆盖

思路

  • 首先可以明确的是,对于每个入度大于等于3的点(也就是有两个或以上儿子的节点),对答案都有贡献,并且这个贡献是任意三个与其相连的部分的权值乘积的加和。(由于每个节点的“分叉位置”不用,所以不会出现重复记录的现象)

  • 也就是说,从根节点(我们取1节点为根)开始,进行到一棵以某节点为根的子树时,设这棵子树权值为 \(q_0\), 而此节点下面的子树权值为 \(q_1, q_2 ··· q_s\), 我们要算的就是

\[\sum_{i = 0}^{s - 2}{\sum_{j = i + 1}^{s - 1}{\sum_{k = j + 1}^{s}{q_i * q_j * q_k}}}
\]
  • 但是我们肯定不能n^3来算,这个时候可以模仿序列和的平方化任意两数乘积加和的公式:
\[((\sum_{i = 0}^{s}{q_i})^2 - \sum_{i = 0}^{s}{q_i ^ 2}) / 2 = \sum_{i = 0}^{s - 1}{\sum_{j = i + 1}^{s}{q_i * q_j}}
\]

来写出序列和的立方化任意三数乘积加和的公式:

\[((\sum_{i = 0}^{s}{q_i})^3 - 3 * \sum_{i = 0}^{s}{q_i ^ 2} *\sum_{i = 0}^{s}{q_i} + 2 * \sum_{i = 0}^{s}{q_i ^ 3}) / 6 = \sum_{i = 0}^{s - 2}{\sum_{j = i + 1}^{s - 1}{\sum_{k = j + 1}^{s}{q_i * q_j * q_k}}}
\]

这样就可以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 立方和拆解的更多相关文章

  1. hdu 4705 dfs统计更新节点信息

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 #pragma comment(linker, "/STACK:16777216&qu ...

  2. hdu 4705(树形DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 思路:反面考虑,用总的方案数减去A,B,C三点在同一路径上的方案数.于是我们可以确定中间点B,在 ...

  3. HDU 4705 Y 树形枚举

    树形枚举--搜索 题目描述: 给你一棵树,要在一条简单路径上选3个不同的点构成一个集合,问能构成多少个不同的集合. 解法: 枚举所有结点,假设某个结点有n棵子树,每棵子树的结点个数分别为s1,s2,` ...

  4. hdu 4705 排列组合

    思路:枚举能是A,B,C在一条简单路径上的中点. 计算多少个几何能满足.在用总数减去 #pragma comment(linker, "/STACK:16777216") #inc ...

  5. HDU 4705 Y

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submis ...

  6. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  7. hdu 4705 Y (树形dp)

    Description Input 4 1 2 1 3 1 4 题目的意思是给你一棵树,让你找到所有不在一条路径上的三个点的情况个数.乍一看正向处理比较麻烦,我们从反方向考虑,如果是取在一条路径上的3 ...

  8. hdu 2007 - 平方和与立方和

    题目大意: 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. 解答: 坑你没商量!要考虑输入数a,b的大小.如果a>b,需要交换a,b的值. 1: #include<s ...

  9. (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)

    题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. [HDU] 平方和与立方和

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2007 //坑:注意判断输入两个数的前后大小关系 // 用while 循环 #include<io ...

随机推荐

  1. PostgreSQL学习笔记-4.基础知识:空值NULL、别名AS

    NULL 值代表遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. 语法 当创建表时,NULL 的基本语法如下: CREATE T ...

  2. 使用Github Action实现构建、发布到 nuget.org

    使用Github Action实现构建.发布到 nuget.org GitHub Actions是GitHub提供的持续集成和持续部署(CI/CD)工具,它能够自动化构建.测试和部署你的项目.在这篇教 ...

  3. 自定义MyBatis拦截器更改表名

    by emanjusaka from ​ https://www.emanjusaka.top/archives/10 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址. 自定义MyBati ...

  4. CSP 2022 游记

    赛前占坑. 由于不知是 \(Day ?\) 故采用日期方式记录. 文笔所限,闲话较多,略显杂乱. 09.?? 接到通知,LN 初赛线上.面基环节无了/kk 09.17 翘 whk 和数学统练参加多校联 ...

  5. JavaScript:用户代理检测:通过浏览器识别平台、操作系统等(Windows, Mac, iOS,iPad等)

    客户端检测经常用的方法:能力检测.怪癖检测和用户代理检测. 能力检测:在写代码前先检测浏览器的能力. 怪癖检测:实际上是浏览器现存的bug. 用户代理检测:通过检测用户代理字符串来识别浏览器. 一般优 ...

  6. Util应用框架基础(二) - 对象到对象映射(AutoMapper)

    本节介绍Util应用框架相似对象之间的转换方法. 文章分为多个小节,如果对设计原理不感兴趣,只需阅读基础用法部分即可. 概述 现代化分层架构,普遍采用了构造块DTO(数据传输对象). DTO是一种参数 ...

  7. Mariadb 10.4 root 用户无法使用无密码登录的原因

    Mariadb现在是网站建设中使用的主流数据库之一,当前它很多个版本:10.1.10.2.10.3.10.4. 其中10.1和10.2在程序中使用root用户登录连接数据库都没有什么问题. 如果是10 ...

  8. centos7安装MySQL—以MySQL5.7.30为例

    centos7安装MySQL-以MySQL5.7.30为例 本文以MySQL5.7.30为例. 官网下载 进入MySQL官网:https://www.mysql.com/ 点击DOWNLOADS 点击 ...

  9. VUE同级组件之前方法调用

    实现:Index.vue页面调用nav.vue页面里的getLeftMenu()方法 一.首先先建一个公共文件,命名eventBus.js,内空为: import Vue from 'vue'expo ...

  10. 🔥🔥Java开发者的Python快速进修指南:面向对象基础

    当我深入学习了面向对象编程之后,我首先感受到的是代码编写的自由度大幅提升.不同于Java中严格的结构和约束,Python在面向对象的实现中展现出更加灵活和自由的特性.它使用了一些独特的关键字,如sel ...