bzoj 2152 点剖分
比较裸的点剖分,访问到每个重心时,记录一个b数组,
代表当前子树中长度为i的边的数量是b[i],因为是3的倍数,
所以边长mod 3保存就行了,然后记录一个sum数组,代表
当前子树中一个子节点为根的子树中的情况(类似b),然后
用这两个数组不断的更新答案就行了。
- /**************************************************************
- Problem:
- User: BLADEVIL
- Language: Pascal
- Result: Accepted
- Time: ms
- Memory: kb
- ****************************************************************/
- //By BLADEVIL
- var
- n :longint;
- pre, other, len :array[..] of longint;
- last :array[..] of longint;
- l, top :longint;
- size, stack, yy :array[..] of longint;
- ff :array[..] of boolean;
- root :longint;
- b, sum :array[..] of longint;
- ans :longint;
- function gcd(x,y:longint):longint;
- begin
- if x<y then exit(gcd(y,x)) else
- if y= then exit(x) else exit(gcd(y,x mod y));
- end;
- procedure connect(x,y,z:longint);
- begin
- inc(l);
- pre[l]:=last[x];
- last[x]:=l;
- other[l]:=y;
- len[l]:=z;
- end;
- procedure dfs_size(x,fa:longint);
- var
- q, p :longint;
- begin
- size[x]:=;
- inc(top);
- stack[top]:=x;
- q:=last[x];
- while q<> do
- begin
- p:=other[q];
- if (ff[q]) or (p=fa) then
- begin
- q:=pre[q];
- continue;
- end;
- dfs_size(p,x);
- inc(size[x],size[p]);
- q:=pre[q];
- end;
- yy[x]:=fa;
- end;
- procedure getroot(u:longint);
- var
- ms, s, x, p, q :longint;
- i :longint;
- begin
- top:=;
- dfs_size(u,);
- ms:=maxlongint;
- for i:= to top do
- begin
- x:=stack[i];
- s:=size[u]-size[x];
- q:=last[x];
- while q<> do
- begin
- p:=other[q];
- if (ff[q]) or (p=yy[x]) then
- begin
- q:=pre[q];
- continue;
- end;
- if size[p]>s then s:=size[p];
- q:=pre[q];
- end;
- if s<ms then
- begin
- ms:=s;
- root:=x;
- end;
- end;
- end;
- procedure dfs_value(x,fa,lz:longint);
- var
- q, p :longint;
- begin
- inc(sum[lz mod ]);
- q:=last[x];
- while q<> do
- begin
- p:=other[q];
- if (p=fa) or (ff[q]) then
- begin
- q:=pre[q];
- continue;
- end;
- dfs_value(p,x,lz+len[q]);
- q:=pre[q];
- end;
- end;
- procedure solve(u:longint);
- var
- i, q, p :longint;
- begin
- getroot(u);
- if top= then exit;
- fillchar(b,sizeof(b),);
- b[]:=;
- top:=;
- q:=last[root];
- while q<> do
- begin
- p:=other[q];
- if ff[q] then
- begin
- q:=pre[q];
- continue;
- end;
- fillchar(sum,sizeof(sum),);
- dfs_value(p,root,len[q]);
- for i:= to do ans:=ans+b[i]*sum[-i];
- ans:=ans+sum[]*b[];
- for i:= to do inc(b[i],sum[i]);
- q:=pre[q];
- end;
- q:=last[root];
- while q<> do
- begin
- p:=other[q];
- if ff[q] then
- begin
- q:=pre[q];
- continue;
- end;
- ff[q]:=true;
- ff[q xor ]:=true;
- solve(p);
- q:=pre[q];
- end;
- end;
- procedure main;
- var
- i :longint;
- x, y, z :longint;
- ans1, ans2 :longint;
- g :longint;
- begin
- read(n);
- l:=;
- fillchar(b,sizeof(b),$ff);
- b[]:=;
- for i:= to n- do
- begin
- read(x,y,z);
- z:=z mod ;
- connect(x,y,z);
- connect(y,x,z);
- end;
- ans:=;
- solve();
- ans1:=*ans+n; ans2:=n*n;
- g:=gcd(ans1,ans2);
- writeln(ans1 div g,'/',ans2 div g);
- end;
- begin
- main;
- end.
bzoj 2152 点剖分的更多相关文章
- bzoj 2152聪聪可可
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MB Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰 ...
- 点分治练习——BZOJ 2152
做的第二道点分治的题目,比较裸,算是模板题吧(感觉比之前那题还简单点. 题目:BZOJ 2152 聪聪可可 题目大意:给出一棵树,求树上两点间长度为3的倍数(0也算)的路径数. 解题思路: 基本和PO ...
- BZOJ 2152 & 点分治
Description: 只是打法法塔前测试一下板子 Code: /*================================= # Created time: 2016-04-20 14:3 ...
- BZOJ 2152: 聪聪可可 树分治
2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- BZOJ 2152: 聪聪可可 点分治
2152: 聪聪可可 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php ...
- bzoj 2152: 聪聪可可 树的点分治
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 485 Solved: 251[Submit][Status] Descripti ...
- 洛谷 2634&&BZOJ 2152: 聪聪可可【点分治学习+超详细注释】
2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 3435 Solved: 1776[Submit][Status][Discuss ...
- bzoj 2152
/************************************************************** Problem: 2152 User: idy002 Language: ...
- BZOJ 2152 聪聪可可(点分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2152 [题目大意] 给出一棵树,问任取两点之间距离为3的倍数的概率是多少 [题解] 树 ...
随机推荐
- formValidator 不支持jquery1.9以上的解决办法
不支持的原因是因为jquery1.9以上版本剔除了$.browser 在formValidator 源码最顶层.或者jquery源码里加上如下代码 $.browser = {};$.browser.m ...
- 【多校联合】(HDU6043)KazaQ's Socks
[多校联合](HDU6043)KazaQ's Socks 一条纯粹的水题,记录下只是因为自己错的太多而已. 原因在于对数据的细节的把握不佳. 原题 KazaQ's Socks Time Limit: ...
- Qt 报错LINK2019:无法解析的外部符号
这里用的都是Qt 自己的东西,但是还是抱错,所以怀疑是没有包含进去,尝试了清理项目,重新编译等,还是不行 用到一个最好的办法,就是把构建的文件夹整个删除,在重新编译就可以了 如图所示,把debug和r ...
- Qt Qwdget 汽车仪表知识点拆解3 进度条编写
先贴上效果图,注意,没有写逻辑,都是乱动的 这篇我来说说左侧的这个进度条的实现原理,其实更简单,哈哈哈 有一个大的widget,根据素材,我放了10个label 剩下的就是写一个函数,根据数据的不同, ...
- python接口自动化: CAS系统验证,自动完成登录并获取token,遇到302请求重定向设置(requests模块 allow_redirects=False)即可
import requestsimport re import requests import re class Crm_token(object): try: username=int(input( ...
- spring boot 线程池配置
1.配置类 package cn.com.bonc.util; import java.util.concurrent.Executor; import java.util.concurrent.Th ...
- Hadoop伪分布式集群
一.HDFS伪分布式环境搭建 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时, ...
- 实战小项目之基于yolo的目标检测web api实现
上个月,对微服务及web service有了一些想法,看了一本app后台开发及运维的书,主要是一些概念性的东西,对service有了一些基本了解.互联网最开始的构架多是cs构架,浏览器兴起以后,变成了 ...
- WebSocket 与 HTTP/2
个人笔记 WebSocket WebSocket 是一个双向通信协议,它在握手阶段采用 HTTP/1.1 协议(暂时不支持 HTTP/2). 握手过程如下: 首先客户端向服务端发起一个特殊的 HTTP ...
- 官方文档 恢复备份指南六 Configuring the RMAN Environment: Advanced Topics
RMAN高级设置. 本章内容: Configuring Advanced Channel Options 高级通道选项 Configuring Advanced Backup Options 高级备 ...