[APIO2018] Duathlon 铁人两项

LG传送门

圆方树+简单DP。

不会圆方树的话可以看看我的另一篇文章

考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数。

看到题面中的一句话:

考虑到安全因素,选择的路径经过同一个点至多一次。

换句话说就是简单路径,用(广义)圆方树的基本条件已经满足,可以把问题变到树上:令方点的权值为所在点双的大小,圆点会被算重所以点权为\(-1\),统计任意两点间的点权和就好了。直接做是\(n ^ 2\)的,考虑枚举每一个点看会产生多少贡献,对答案的贡献就乘个点权。

注意图不一定联通。

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <vector>
  4. #define R register
  5. #define I inline
  6. #define B 1000000
  7. #define L long long
  8. using namespace std;
  9. const int N = 200003;
  10. char buf[B], *p1, *p2;
  11. I char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, B, stdin), p1 == p2) ? EOF : *p1++; }
  12. I int rd() {
  13. R int f = 0;
  14. R char c = gc();
  15. while (c < 48 || c > 57)
  16. c = gc();
  17. while (c > 47 && c < 58)
  18. f = f * 10 + (c ^ 48), c = gc();
  19. return f;
  20. }
  21. L ans = 0;
  22. int s[N], w[N], dfn[N], low[N], vis[N], sta[N], siz[N], n, tim, cnt, stp, tot;
  23. vector <int> g[N], G[N];
  24. I int min(int x, int y) { return x < y ? x : y; }
  25. void dfs(int x) {
  26. dfn[x] = low[x] = ++tim, sta[++stp] = x, w[x] = -1, ++tot;
  27. for (R int i = 0, y, z; i < s[x]; ++i)
  28. if (!dfn[y = g[x][i]]){
  29. dfs(y), low[x] = min(low[x], low[y]);
  30. if (low[y] >= dfn[x]) {
  31. w[++cnt] = 1, G[x].push_back(cnt), G[cnt].push_back(x);
  32. do {
  33. z = sta[stp--], ++w[cnt], G[z].push_back(cnt), G[cnt].push_back(z);
  34. } while (z ^ y);
  35. }
  36. }
  37. else
  38. low[x] = min(low[x], dfn[y]);
  39. }
  40. void calc(int x, int f) {
  41. siz[x] = vis[x] = x <= n;
  42. L tmp = 0;
  43. for (R int i = 0, y, S = G[x].size(); i < S; ++i)
  44. if ((y = G[x][i]) ^ f)
  45. calc(y, x), tmp += 2ll * siz[y] * siz[x], siz[x] += siz[y];
  46. tmp += 2ll * siz[x] * (tot - siz[x]), ans += tmp * w[x];
  47. }
  48. int main() {
  49. freopen("a.in", "r", stdin);
  50. R int m, i, x, y;
  51. cnt = n = rd(), m = rd();
  52. for (i = 1; i <= m; ++i)
  53. x = rd(), y = rd(), g[x].push_back(y), g[y].push_back(x);
  54. for (i = 1; i <= n; ++i)
  55. s[i] = g[i].size();
  56. for (i = 1; i <= n; ++i)
  57. if (!vis[i])
  58. stp = 0, tot = 0, dfs(i), calc(i, 0);
  59. printf("%lld", ans);
  60. return 0;
  61. }

[APIO2018] Duathlon 铁人两项 圆方树,DP的更多相关文章

  1. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...

  2. LOJ 2587 「APIO2018」铁人两项——圆方树

    题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...

  3. loj2587 「APIO2018」铁人两项[圆方树+树形DP]

    主要卡在一个结论上..关于点双有一个常用结论,也经常作为在圆方树/简单路径上的良好性质,对于任意点双内互不相同的三点$s,c,t$,都存在简单路径$s\to c\to t$,证明不会.可以参见clz博 ...

  4. [BZOJ5463][APIO2018]铁人两项(圆方树DP)

    题意:给出一张图,求满足存在一条从u到v的长度大于3的简单路径的有序点对(u,v)个数. 做了上一题[HDU5739]Fantasia(点双连通分量+DP),这个题就是一个NOIP题了. 一开始考虑了 ...

  5. [APIO2018]铁人两项 --- 圆方树

     [APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...

  6. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  7. [APIO2018]铁人两项 [圆方树模板]

    把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...

  8. 洛谷P4630 铁人两项--圆方树

    一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...

  9. 洛谷P4630 [APIO2018] Duathlon 铁人两项 (圆方树)

    圆方树大致理解:将每个点双看做一个新建的点(方点),该点双内的所有点(圆点)都向新建的点连边,最后形成一棵树,可以给点赋予点权,用以解决相关路径问题. 在本题中,方点点权赋值为该点双的大小,因为两个点 ...

随机推荐

  1. 转: c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法

    //这样产生0 ~ 100的强随机数(含100) ; int rnd = int.MinValue; decimal _base = (decimal)long.MaxValue; ]; System ...

  2. 利用Linode面板Clone克隆搬家迁移不同VPS数据及利用IP Swap迁移IP地址

    在众多海外VPS服务商中,老蒋个人认为Linode提供的VPS方案和性价比还是比较高的,尤其目前基础1GB方案仅需10美元每月且全部是SSD固态硬盘,无论是流量还是硬盘大小,基本上可以满足我们大部分用 ...

  3. #002 Emmet完整API

    介绍 这里包含了,所有的Emmet API,非常的详细,但是有一点详细过头了,如果只想快速上手,那么推荐<#001 Emmet的API图片> Emmet (前身为 Zen Coding) ...

  4. 来自苹果的编程语言——Swift简单介绍【整理】

    2014年06月03日凌晨,Apple刚刚公布了Swift编程语言,本文从其公布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS& ...

  5. [WHY]Hello, Worktile~

    本来是水水的去听一听云计算大会,感受一下氛围的, 万万没想到,竟然意外的參观了Worktile,这也成了北京之旅最值得纪念的记忆. 先是路上看到QQ有个好友请求,备注是Worktile市场的小泽. 从 ...

  6. [USACO08NOV]Mixed Up Cows

    嘟嘟嘟 一看n那么小,那一定是状压dp了(表示从没写过,慌). 首先dp[i][j](i 是一个二进制数,第x位为1代表选了第x头牛),表示 i 这个状态最后一头牛是第 j 头牛时的方案数. 然后当 ...

  7. js如何将时间戳转换为标准时间

    function formatDate(date,fmt){ let o = { 'M+' : date.getMonth() +1, //月份 'd+' : date.getDate(), //日 ...

  8. ASP.NET MVC编程——路由

    框架自动生成的路由配置 上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs. 代码如下: public class RouteConfig { public static ...

  9. VMware虚拟机安装Mac OS X

    安装mac系统学习网站来源:http://blog.csdn.net/hamber_bao/article/details/51335834 1.下载安装VMware workstation (1)首 ...

  10. CentOS7.2安装mysql

    1. 下载Mysql yum包 http://dev.mysql.com/downloads/repo/yum/ 复制链接使用wget下载 wget http://repo.mysql.com/mys ...