长链剖分优化 \(dp\) 模板

不过这 \(dp\) 真毒

\(\text{Code}\)

  1. #include <cstdio>
  2. #define RE register
  3. #define IN inline
  4. using namespace std;
  5. typedef long long LL;
  6. const int N = 1e5 + 5;
  7. int n, h[N], tot, len[N], son[N];
  8. struct edge{int to, nxt;}e[N << 1];
  9. IN void add(int x, int y){e[++tot] = (edge){y, h[x]}, h[x] = tot;}
  10. void dfs(int x, int fa)
  11. {
  12. for(RE int i = h[x]; i; i = e[i].nxt)
  13. {
  14. int v = e[i].to;
  15. if (v == fa) continue;
  16. dfs(v, x), son[x] = (len[v] > len[son[x]] ? v : son[x]);
  17. }
  18. len[x] = len[son[x]] + 1;
  19. }
  20. LL tmp[N << 2], *id = tmp, *f[N], *g[N], ans;
  21. void DP(int x, int fa)
  22. {
  23. if (son[x]) f[son[x]] = f[x] + 1, g[son[x]] = g[x] - 1, DP(son[x], x);
  24. f[x][0] = 1, ans += g[x][0];
  25. for(RE int i = h[x]; i; i = e[i].nxt)
  26. {
  27. int v = e[i].to;
  28. if (v == fa || v == son[x]) continue;
  29. f[v] = id, id += len[v] << 1, g[v] = id, id += len[v] << 1, DP(v, x);
  30. for(RE int j = 0; j < len[v]; j++)
  31. {
  32. if (j) ans += f[x][j - 1] * g[v][j];
  33. ans += g[x][j + 1] * f[v][j];
  34. }
  35. for(RE int j = 0; j < len[v]; j++)
  36. {
  37. g[x][j + 1] += f[x][j + 1] * f[v][j];
  38. if (j) g[x][j - 1] += g[v][j];
  39. f[x][j + 1] += f[v][j];
  40. }
  41. }
  42. }
  43. int main()
  44. {
  45. scanf("%d", &n);
  46. for(RE int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
  47. dfs(1, 0), f[1] = id, id += len[1] << 1, g[1] = id, id += len[1] << 1, DP(1, 0);
  48. printf("%lld\n", ans);
  49. }

[POI2014]HOT-Hotels 加强版的更多相关文章

  1. 4543: [POI2014]Hotel加强版

    4543: [POI2014]Hotel加强版 链接 分析: f[u][i]表示子树u内,距离u为i的点的个数,g[u][i]表示在子树u内,已经选了两个深度一样的点,还需要在距离u为i的一个点作为第 ...

  2. 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 ...

  3. 【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. 【刷题】BZOJ 4543 [POI2014]Hotel加强版

    Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...

  5. BZOJ4543 [POI2014]Hotel加强版

    题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...

  6. bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...

  7. BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP

    题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...

  8. BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)

    题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...

  9. 2019.01.08 bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)

    传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j​表示iii子树中离 ...

  10. 【bzoj4543】[POI2014]Hotel加强版

    题目 抄题解.jpg 发现原来的\(O(n^2)\)的换根\(dp\)好像行不通了呀 我们考虑非常牛逼的长链剖分 我们设\(f[x][j]\)表示在\(x\)的子树中距离\(x\)为\(j\)的点有多 ...

随机推荐

  1. ssh框架中文保存数据库MySQL乱码

    检查后台获取前端页面数据打印到console控制台无乱码:tomcat配置没有问题: 检查MySQL数据库编码设置:字符集:utf8 -- UTF-8 Unicode,排序规则:utf8_genera ...

  2. 数电第四周周结_by_yc

    数电第四周周结 1.赋值语句 基本概念: 连续赋值:   1.连续赋值不能出现在过程块(如initial,always)中间:   2.连续赋值语句之间是并行的:   3. 只能对wire型变量进行赋 ...

  3. 【大数据面试】【数仓项目】分层:ODS层、DWD层、DWS层、ADS层构成、操作

    一.ODS层 1.保持数据原貌,不做任何修改 2.数据压缩:LZO压缩,减少磁盘空间 3.创建的是分区表:可以防止后续的全表扫描 包括 用户行为:string line dt    ods_start ...

  4. v-if v-for同时使用 解决eslint报错问题

    <template v-for="sec in item.goods"> <div v-if="item.showDetail" class= ...

  5. 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 ...

  6. mysql数据库(字段约束条件)

    什么是字段约束 字段约束就是将字段的内容定一个规则,我们要按照规则办事 约束 描述 关键字 非空约束 限制该字段的数据不能为null not null 唯一约束 保证该字段的所有数据都是唯一.不重复的 ...

  7. STM32点亮LED的代码

    led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...

  8. Anaconda下载安装

    下载地址: 链接:https://pan.baidu.com/s/1fmJkMSL6amJF4KP5JwklOQ 提取码:dsyc 安装完成之后,记得配置系统环境变量:

  9. Octave/Matlab初步学习

    Octave/Matlab初步学习 1.基本运算 和其他语言一样,可以通过数学运算符号来实现数学公式的运算.逻辑运算也基本相同 要注意的是,≠这个符号,表达式为 1 ~= 2 而不是用!=来表达 ​ ...

  10. idea里面连接数据库进行sql操作

    常用写法 1. private static void test01() throws ClassNotFoundException, SQLException{ Class.forName(&quo ...