NOIP2016模拟赛三 Problem C: 不虚就是要AK
题目大意
给定一棵带有边权的树, 问你在树上随机选两个点, 它们最短路径上的边权之和为\(4\)的倍数的概率为多少.
Solution
树分治. 没什么好讲的.
#include <cstdio>
#include <cctype>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
namespace Zeonfai
{
inline int getInt()
{
int a = 0, sgn = 1; char c;
while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
}
const int N = (int)2e4;
int n;
int cnt[4];
long long ans;
struct tree
{
struct edge
{
int v, w;
inline edge(int _v, int _w) {v = _v; w = _w;}
};
struct node
{
vector<edge> edg;
int vst, sz, mx;
inline node() {vst = 0; edg.clear();}
}nd[N + 1];
inline void initialize() {for(int i = 1; i <= n; ++ i) nd[i] = node();}
inline void addEdge(int u, int v, int w) {nd[u].edg.push_back(edge(v, w)); nd[v].edg.push_back(edge(u, w));}
void getSize(int u, int pre)
{
nd[u].sz = 1; nd[u].mx = 0;
for(auto edg : nd[u].edg) if(edg.v != pre && ! nd[edg.v].vst)
getSize(edg.v, u), nd[u].sz += nd[edg.v].sz, nd[u].mx = max(nd[u].mx, nd[edg.v].sz);
}
int getRoot(int u, int pre, int cen)
{
nd[u].mx = max(nd[u].mx, nd[cen].sz - nd[u].sz);
int res = u;
for(auto edg : nd[u].edg) if(edg.v != pre && ! nd[edg.v].vst)
{
int cur = getRoot(edg.v, u, cen);
if(nd[cur].mx < nd[res].mx) res = cur;
}
return res;
}
void getAnswer(int u, int pre, long long len)
{
ans += cnt[(4 - len % 4) % 4] << 1;
for(auto edg : nd[u].edg) if(edg.v != pre && ! nd[edg.v].vst) getAnswer(edg.v, u, len + edg.w);
}
void update(int u, int pre, long long len)
{
++ cnt[len % 4];
for(auto edg : nd[u].edg) if(edg.v != pre && ! nd[edg.v].vst) update(edg.v, u, len + edg.w);
}
inline void work(int u)
{
getSize(u, -1);
u = getRoot(u, -1, u);
memset(cnt, 0, sizeof(cnt)); cnt[0] = 1; ans += 1;
for(auto edg : nd[u].edg) if(! nd[edg.v].vst)
{
getAnswer(edg.v, u, edg.w);
update(edg.v, u, edg.w);
}
nd[u].vst = 1;
for(auto edg : nd[u].edg) if(! nd[edg.v].vst) work(edg.v);
}
inline void work() {ans = 0; work(1);}
}T;
inline void output(long long a, long long b)
{
long long _a = a, _b = b;
if(_a < _b) swap(_a, _b);
while(_b)
{
long long tmp = _b;
_b = _a % _b;
_a = tmp;
}
printf("%lld/%lld\n", a / _a, b / _a);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("AK.in", "r", stdin);
freopen("AK.out", "w", stdout);
#endif
using namespace Zeonfai;
while(n = getInt())
{
T.initialize();
for(int i = 1, u, v, c; i < n; ++ i) u = getInt(), v = getInt(), c = getInt(), T.addEdge(u, v, c);
T.work();
output(ans, (long long)n * n);
}
}
NOIP2016模拟赛三 Problem C: 不虚就是要AK的更多相关文章
- NOIP2016模拟赛三 Problem B: 神奇的树
题面 Description 有一棵神奇的树.这棵树有N个节点,在每个节点上都有宝藏,每个宝藏价值V[i]金币:对于每条边,每经过一次都要花费C[i]金币. 值得注意的是,每个宝藏只能领取一次(也可以 ...
- NOIp2018模拟赛三十六
好久没打模拟赛了...今天一样是两道国集,一道bzoj题 成绩:13+0+95=108 A题开始看错题了...导致样例都没看懂,结果xfz提醒我后我理解了一个我自认为正确的题意(事实证明我和xfz都错 ...
- 串门赛: NOIP2016模拟赛——By Marvolo 丢脸记
前几天liu_runda来机房颓废,顺便扔给我们一个网址,说这上面有模拟赛,让我们感兴趣的去打一打.一开始还是没打算去看一下的,但是听std说好多人都打,想了一下,还是打一打吧,打着玩,然后就丢脸了. ...
- NOIP2016 模拟赛
7.10 T1:求出一个矩阵中平均数大于0的子矩阵的最大面积. T2:给出一个N行的,第I行有n+1-i的倒三角形,从中选取m个数,只有当前数的左上角和右上角都被选是才能选当前数,求选的数字的最大和 ...
- 学军NOIP2016模拟赛1
GTMD这么水的一套题没有AK T1:妥妥的二分答案,贪心check. T2:问题可以转化为最长上升(还是下降我记不住了)子序列. T3:发现点被覆盖上的顺序是一定的.求出这个顺序,第一个操作在线段树 ...
- NOIp2018模拟赛三十八
爆〇啦~ A题C题不会写,B题头铁写正解: 随手过拍很自信,出分一看挂成零. 若要问我为什么?gtmdsubtask! 神tm就一个subtask要么0分要么100,结果我预处理少了一点当场去世 难受 ...
- NOIp2018模拟赛三十七
奇怪的一场... 前两题都是全场题,C题明显不可做,我题目都没看懂...(STO lhx OTZ) 成绩:100+100+8=208 貌似十几个208的...A题暴力$O(nmc)$能过...暴力容斥 ...
- NOIp2018模拟赛三十五
两道大数据结构把我砸懵 成绩:未提交 Orz xfz两道正解 A:[BZOJ4049][CREC2014B]mountainous landscape B:CJB的大作(CF改编题)
- NOIp模拟赛三十四(yxq供题)
毒瘤yxq! 毒瘤yxq! 毒瘤yxq! 据yxq自己说,林导让他出题的时候要求是“代码量少”,“思维难度高”,“不涉及太复杂的算法”,而且“最好要让myh有一题做不出来”(狙击myh).于是今天的题 ...
随机推荐
- Go语言之并发编程(三)
Telnet回音服务器 Telnet协议是TCP/IP协议族中的一种.它允许用户(Telnet客户端)通过一个协商过程与一个远程设备进行通信.本例将使用一部分Telnet协议与服务器进行通信. 服务器 ...
- ogre3D学习基础4 -- 网格工具与硬件缓存
三.网格工具(Mesh) 1.导出器(Exporters)--- 用于从模型生成器中得到数据并且导入到OGRE中去. 导出器是指通过3D模型工具的插件写成网格数据和骨骼动画的文件格式可以在OGRE中被 ...
- Leetcode 554.砖墙
砖墙 你的面前有一堵方形的.由多行砖块组成的砖墙. 这些砖块高度相同但是宽度不同.你现在要画一条自顶向下的.穿过最少砖块的垂线. 砖墙由行的列表表示. 每一行都是一个代表从左至右每块砖的宽度的整数列表 ...
- 纸上得来终觉浅,绝知此事要躬行——Spring boot任务调度
前言:之前今日开讲项目的时候,用到了Quartz进行任务调度.后来做一个电商项目的时候,还用到了Quartz任务调度. 觉得挺简单的,a peace of cake. 忽略了总结,当时闭着眼睛都能捉 ...
- [SCOI2007][bzoj1070] 修车 [费用流]
题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...
- Gym 100971C 水&愚&三角形
Description standard input/output Announcement Statements There is a set of n segments with the le ...
- apache 列目录修复
描述 :Apache默认配置时允许目录浏览.如果目录下没有索引文件,则会出现目录浏览,导致文件信息泄漏. 检测方法:直接访问目录,如果能看到目录下的文件信息,则说明存在目录浏览漏洞 加固方法: 1 ...
- Vue实现增删改查功能
简单的表单CURD功能demo <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- NodeJS学习(1)--- 安装配置介绍
Node.js 安装配置 本章节我们将向大家介绍在window和Linux上安装Node.js的方法. 本安装教程以Node.js v6.10.1 LTS(长期支持版本)版本为例. Node.js安装 ...
- mac 安装 photoshop CS6
终于找到破解了,索性写个图文并茂的全解吧.1. 官方下载photosho CS6 machttp://trials2.stage.adobe.com/A ... hotoshop_13_LS3.dmg ...