比较裸的点剖分,访问到每个重心时,记录一个b数组,

代表当前子树中长度为i的边的数量是b[i],因为是3的倍数,

所以边长mod 3保存就行了,然后记录一个sum数组,代表

当前子树中一个子节点为根的子树中的情况(类似b),然后

用这两个数组不断的更新答案就行了。

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. var
  12.     n                               :longint;
  13.     pre, other, len                 :array[..] of longint;
  14.     last                            :array[..] of longint;
  15.     l, top                          :longint;
  16.     size, stack, yy                 :array[..] of longint;
  17.     ff                              :array[..] of boolean;
  18.     root                            :longint;
  19.     b, sum                          :array[..] of longint;
  20.     ans                                 :longint;
  21.      
  22. function gcd(x,y:longint):longint;
  23. begin
  24.     if x<y then exit(gcd(y,x)) else
  25.     if y= then exit(x) else exit(gcd(y,x mod y));
  26. end;
  27.      
  28. procedure connect(x,y,z:longint);
  29. begin
  30.     inc(l);
  31.     pre[l]:=last[x];
  32.     last[x]:=l;
  33.     other[l]:=y;
  34.     len[l]:=z;
  35. end;
  36.  
  37. procedure dfs_size(x,fa:longint);
  38. var
  39.     q, p                            :longint;
  40. begin
  41.     size[x]:=;
  42.     inc(top);
  43.     stack[top]:=x;
  44.     q:=last[x];
  45.     while q<> do
  46.     begin
  47.         p:=other[q];
  48.         if (ff[q]) or (p=fa) then
  49.         begin
  50.             q:=pre[q];
  51.             continue;
  52.         end;
  53.         dfs_size(p,x);
  54.         inc(size[x],size[p]);
  55.         q:=pre[q];
  56.     end;
  57.     yy[x]:=fa;
  58. end;
  59.  
  60. procedure getroot(u:longint);
  61. var
  62.     ms, s, x, p, q                  :longint;
  63.     i                               :longint;
  64. begin
  65.     top:=;
  66.     dfs_size(u,);
  67.     ms:=maxlongint;
  68.     for i:= to top do
  69.     begin
  70.         x:=stack[i];
  71.         s:=size[u]-size[x];
  72.         q:=last[x];
  73.         while q<> do
  74.         begin
  75.             p:=other[q];
  76.             if (ff[q]) or (p=yy[x]) then
  77.             begin
  78.                 q:=pre[q];
  79.                 continue;
  80.             end;
  81.             if size[p]>s then s:=size[p];
  82.             q:=pre[q];
  83.         end;
  84.         if s<ms then
  85.         begin
  86.             ms:=s;
  87.             root:=x;
  88.         end;
  89.     end;
  90. end;
  91.  
  92. procedure dfs_value(x,fa,lz:longint);
  93. var
  94.     q, p                            :longint;
  95. begin
  96.     inc(sum[lz mod ]);
  97.     q:=last[x];
  98.     while q<> do
  99.     begin
  100.         p:=other[q];
  101.         if (p=fa) or (ff[q]) then
  102.         begin
  103.             q:=pre[q];
  104.             continue;
  105.         end;
  106.         dfs_value(p,x,lz+len[q]);
  107.         q:=pre[q];
  108.     end;
  109. end;
  110.  
  111. procedure solve(u:longint);
  112. var
  113.     i, q, p                         :longint;
  114.      
  115. begin
  116.     getroot(u);
  117.     if top= then exit;
  118.     fillchar(b,sizeof(b),);
  119.     b[]:=;
  120.     top:=;
  121.     q:=last[root];
  122.     while q<> do
  123.     begin
  124.         p:=other[q];
  125.         if ff[q] then
  126.         begin
  127.             q:=pre[q];
  128.             continue;
  129.         end;
  130.         fillchar(sum,sizeof(sum),);
  131.         dfs_value(p,root,len[q]);
  132.         for i:= to do ans:=ans+b[i]*sum[-i];
  133.         ans:=ans+sum[]*b[];
  134.         for i:= to do inc(b[i],sum[i]);
  135.         q:=pre[q];
  136.     end;
  137.      
  138.     q:=last[root];
  139.     while q<> do
  140.     begin
  141.         p:=other[q];
  142.         if ff[q] then
  143.         begin
  144.             q:=pre[q];
  145.             continue;
  146.         end;
  147.         ff[q]:=true;
  148.         ff[q xor ]:=true;
  149.         solve(p);
  150.         q:=pre[q];
  151.     end;
  152.          
  153. end;
  154.  
  155.      
  156. procedure main;
  157. var
  158.     i                               :longint;
  159.     x, y, z                         :longint;
  160.     ans1, ans2                      :longint;
  161.     g                               :longint;
  162.      
  163. begin
  164.     read(n);
  165.     l:=;
  166.     fillchar(b,sizeof(b),$ff);
  167.     b[]:=;   
  168.     for i:= to n- do
  169.     begin
  170.         read(x,y,z);
  171.         z:=z mod ;
  172.         connect(x,y,z);
  173.         connect(y,x,z);
  174.     end;
  175.     ans:=;
  176.     solve();
  177.     ans1:=*ans+n; ans2:=n*n;
  178.     g:=gcd(ans1,ans2);
  179.     writeln(ans1 div g,'/',ans2 div g);
  180. end;
  181.  
  182. begin
  183.     main;
  184. end.

bzoj 2152 点剖分的更多相关文章

  1. bzoj 2152聪聪可可

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MB Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰 ...

  2. 点分治练习——BZOJ 2152

    做的第二道点分治的题目,比较裸,算是模板题吧(感觉比之前那题还简单点. 题目:BZOJ 2152 聪聪可可 题目大意:给出一棵树,求树上两点间长度为3的倍数(0也算)的路径数. 解题思路: 基本和PO ...

  3. BZOJ 2152 & 点分治

    Description: 只是打法法塔前测试一下板子 Code: /*================================= # Created time: 2016-04-20 14:3 ...

  4. BZOJ 2152: 聪聪可可 树分治

    2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  5. BZOJ 2152: 聪聪可可 点分治

    2152: 聪聪可可 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...

  6. bzoj 2152: 聪聪可可 树的点分治

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 485  Solved: 251[Submit][Status] Descripti ...

  7. 洛谷 2634&&BZOJ 2152: 聪聪可可【点分治学习+超详细注释】

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 3435  Solved: 1776[Submit][Status][Discuss ...

  8. bzoj 2152

    /************************************************************** Problem: 2152 User: idy002 Language: ...

  9. BZOJ 2152 聪聪可可(点分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2152 [题目大意] 给出一棵树,问任取两点之间距离为3的倍数的概率是多少 [题解] 树 ...

随机推荐

  1. formValidator 不支持jquery1.9以上的解决办法

    不支持的原因是因为jquery1.9以上版本剔除了$.browser 在formValidator 源码最顶层.或者jquery源码里加上如下代码 $.browser = {};$.browser.m ...

  2. 【多校联合】(HDU6043)KazaQ's Socks

    [多校联合](HDU6043)KazaQ's Socks 一条纯粹的水题,记录下只是因为自己错的太多而已. 原因在于对数据的细节的把握不佳. 原题 KazaQ's Socks Time Limit: ...

  3. Qt 报错LINK2019:无法解析的外部符号

    这里用的都是Qt 自己的东西,但是还是抱错,所以怀疑是没有包含进去,尝试了清理项目,重新编译等,还是不行 用到一个最好的办法,就是把构建的文件夹整个删除,在重新编译就可以了 如图所示,把debug和r ...

  4. Qt Qwdget 汽车仪表知识点拆解3 进度条编写

    先贴上效果图,注意,没有写逻辑,都是乱动的 这篇我来说说左侧的这个进度条的实现原理,其实更简单,哈哈哈 有一个大的widget,根据素材,我放了10个label 剩下的就是写一个函数,根据数据的不同, ...

  5. python接口自动化: CAS系统验证,自动完成登录并获取token,遇到302请求重定向设置(requests模块 allow_redirects=False)即可

    import requestsimport re import requests import re class Crm_token(object): try: username=int(input( ...

  6. spring boot 线程池配置

    1.配置类 package cn.com.bonc.util; import java.util.concurrent.Executor; import java.util.concurrent.Th ...

  7. Hadoop伪分布式集群

    一.HDFS伪分布式环境搭建 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时, ...

  8. 实战小项目之基于yolo的目标检测web api实现

    上个月,对微服务及web service有了一些想法,看了一本app后台开发及运维的书,主要是一些概念性的东西,对service有了一些基本了解.互联网最开始的构架多是cs构架,浏览器兴起以后,变成了 ...

  9. WebSocket 与 HTTP/2

    个人笔记 WebSocket WebSocket 是一个双向通信协议,它在握手阶段采用 HTTP/1.1 协议(暂时不支持 HTTP/2). 握手过程如下: 首先客户端向服务端发起一个特殊的 HTTP ...

  10. 官方文档 恢复备份指南六 Configuring the RMAN Environment: Advanced Topics

    RMAN高级设置. 本章内容: Configuring Advanced Channel Options  高级通道选项 Configuring Advanced Backup Options 高级备 ...