[POI2014]HOT-Hotels 加强版
长链剖分优化 \(dp\) 模板
不过这 \(dp\) 真毒
\(\text{Code}\)
#include <cstdio>
#define RE register
#define IN inline
using namespace std;
typedef long long LL;
const int N = 1e5 + 5;
int n, h[N], tot, len[N], son[N];
struct edge{int to, nxt;}e[N << 1];
IN void add(int x, int y){e[++tot] = (edge){y, h[x]}, h[x] = tot;}
void dfs(int x, int fa)
{
for(RE int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa) continue;
dfs(v, x), son[x] = (len[v] > len[son[x]] ? v : son[x]);
}
len[x] = len[son[x]] + 1;
}
LL tmp[N << 2], *id = tmp, *f[N], *g[N], ans;
void DP(int x, int fa)
{
if (son[x]) f[son[x]] = f[x] + 1, g[son[x]] = g[x] - 1, DP(son[x], x);
f[x][0] = 1, ans += g[x][0];
for(RE int i = h[x]; i; i = e[i].nxt)
{
int v = e[i].to;
if (v == fa || v == son[x]) continue;
f[v] = id, id += len[v] << 1, g[v] = id, id += len[v] << 1, DP(v, x);
for(RE int j = 0; j < len[v]; j++)
{
if (j) ans += f[x][j - 1] * g[v][j];
ans += g[x][j + 1] * f[v][j];
}
for(RE int j = 0; j < len[v]; j++)
{
g[x][j + 1] += f[x][j + 1] * f[v][j];
if (j) g[x][j - 1] += g[v][j];
f[x][j + 1] += f[v][j];
}
}
}
int main()
{
scanf("%d", &n);
for(RE int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
dfs(1, 0), f[1] = id, id += len[1] << 1, g[1] = id, id += len[1] << 1, DP(1, 0);
printf("%lld\n", ans);
}
[POI2014]HOT-Hotels 加强版的更多相关文章
- 4543: [POI2014]Hotel加强版
4543: [POI2014]Hotel加强版 链接 分析: f[u][i]表示子树u内,距离u为i的点的个数,g[u][i]表示在子树u内,已经选了两个深度一样的点,还需要在距离u为i的一个点作为第 ...
- BZOJ4543 POI2014 Hotel加强版 【长链剖分】【DP】*
BZOJ4543 POI2014 Hotel加强版 Description 同OJ3522 数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 ...
- 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- BZOJ4543 [POI2014]Hotel加强版
题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...
- bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...
- BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...
- BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...
- 2019.01.08 bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)
传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j表示iii子树中离 ...
- 【bzoj4543】[POI2014]Hotel加强版
题目 抄题解.jpg 发现原来的\(O(n^2)\)的换根\(dp\)好像行不通了呀 我们考虑非常牛逼的长链剖分 我们设\(f[x][j]\)表示在\(x\)的子树中距离\(x\)为\(j\)的点有多 ...
随机推荐
- ssh框架中文保存数据库MySQL乱码
检查后台获取前端页面数据打印到console控制台无乱码:tomcat配置没有问题: 检查MySQL数据库编码设置:字符集:utf8 -- UTF-8 Unicode,排序规则:utf8_genera ...
- 数电第四周周结_by_yc
数电第四周周结 1.赋值语句 基本概念: 连续赋值: 1.连续赋值不能出现在过程块(如initial,always)中间: 2.连续赋值语句之间是并行的: 3. 只能对wire型变量进行赋 ...
- 【大数据面试】【数仓项目】分层:ODS层、DWD层、DWS层、ADS层构成、操作
一.ODS层 1.保持数据原貌,不做任何修改 2.数据压缩:LZO压缩,减少磁盘空间 3.创建的是分区表:可以防止后续的全表扫描 包括 用户行为:string line dt ods_start ...
- v-if v-for同时使用 解决eslint报错问题
<template v-for="sec in item.goods"> <div v-if="item.showDetail" class= ...
- node-sass报错(Node Sass could not find a binding for your current environment)
解决方案:参考 https://stackoverflow.com/questions/37986800/node-sass-couldnt-find-a-binding-for-your-curre ...
- mysql数据库(字段约束条件)
什么是字段约束 字段约束就是将字段的内容定一个规则,我们要按照规则办事 约束 描述 关键字 非空约束 限制该字段的数据不能为null not null 唯一约束 保证该字段的所有数据都是唯一.不重复的 ...
- STM32点亮LED的代码
led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...
- Anaconda下载安装
下载地址: 链接:https://pan.baidu.com/s/1fmJkMSL6amJF4KP5JwklOQ 提取码:dsyc 安装完成之后,记得配置系统环境变量:
- Octave/Matlab初步学习
Octave/Matlab初步学习 1.基本运算 和其他语言一样,可以通过数学运算符号来实现数学公式的运算.逻辑运算也基本相同 要注意的是,≠这个符号,表达式为 1 ~= 2 而不是用!=来表达 ...
- idea里面连接数据库进行sql操作
常用写法 1. private static void test01() throws ClassNotFoundException, SQLException{ Class.forName(&quo ...