【点分治练习题·不虚就是要AK】点分治
不虚就是要AK(czyak.c/.cpp/.pas) 2s 128M by zhb
czy很火。因为又有人说他虚了。为了证明他不虚,他决定要在这次比赛AK。
现在他正在和别人玩一个游戏:在一棵树上随机取两个点,如果这两个点的距离是4的倍数,那么算czy赢,否则对方赢。现在czy想知道他能获胜的概率。
*最终输出的概率要求分数的分子和分母的和尽量小且非负数
本题多组数据。对于每组数据:
第一行一个数n,表示树上的节点个数
接下来n-1条边a,b,c描述a到b有一条长度为c的路径
当n=0时表示读入结束
数据组数不超过10。无部分分
输入数据
5
1 2 1
1 3 2
1 4 1
2 5 3
0
输出数据
7/25
数据范围
|
数据点 |
n的规模 |
数据组数 |
随机生成数据 |
|
1 |
200 |
1 |
是 |
|
2 |
200 |
1 |
是 |
|
3 |
200 |
<=3 |
是 |
|
4 |
2000 |
<=3 |
是 |
|
5 |
2000 |
<=3 |
是 |
|
6 |
2000 |
<=5 |
是 |
|
7 |
20000 |
<=5 |
否 |
|
8 |
20000 |
<=5 |
否 |
|
9 |
20000 |
<=10 |
否 |
|
10 |
20000 |
<=10 |
否 |
这题其实跟找距离=K的点对有多少个是一样的,我们把距离全部不断mod4就可以了。
然后就是点分治。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N=;
int n,len,ans;
int v[],t[],d[N],first[N],mark[N],size[N];
struct node{
int x,y,d,next;
}a[*N]; void ins(int x,int y,int d)
{
a[++len].x=x;a[len].y=y;a[len].d=d;
a[len].next=first[x];first[x]=len;
} int gcd(int x,int y)
{
if(y==) return x;
return gcd(y,x%y);
} void find_root(int x,int fa,int tot,int &root)
{
size[x]=;
bool bk=;
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(y==fa || mark[y]) continue;
find_root(y,x,tot,root);
size[x]+=size[y];
if(*size[y]>tot) bk=;
}
if(bk && *(tot-size[x])<=tot) root=x;
} void DFS(int x,int fa)
{
int now=((-d[x])%+)%;
ans+=v[now];
t[d[x]]++;
size[x]=;
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(mark[y] || y==fa) continue;
d[y]=(d[x]+a[i].d)%;
DFS(y,x);
size[x]+=size[y];
}
} void dfs(int x,int tot)
{
find_root(x,,tot,x); memset(v,,sizeof(v));
mark[x]=;d[x]=;v[]++; for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(mark[y]) continue;
d[y]=d[x]+a[i].d;
memset(t,,sizeof(t));
DFS(y,x);
for(int j=;j<;j++) v[j]+=t[j];
}
for(int i=first[x];i;i=a[i].next)
{
int y=a[i].y;
if(mark[y]) continue;
dfs(y,size[y]);
}
} int main()
{
freopen("a.in","r",stdin);
// freopen("czyak.in","r",stdin);
// freopen("czyak.out","w",stdout);
while()
{
scanf("%d",&n);
if(!n) break;
ans=;len=;
memset(mark,,sizeof(mark));
memset(first,,sizeof(first));
for(int i=;i<n;i++)
{
int x,y,d;
scanf("%d%d%d",&x,&y,&d);
d%=;
ins(x,y,d);
ins(y,x,d);
}
// for(int i=1;i<=len;i+=2) printf("%d --> %d %d\n",a[i].x,a[i].y,a[i].d);
dfs(,n);
int fz=*ans+n,fm=n*n;
int g=gcd(fz,fm);
fz/=g;fm/=g;
printf("%d/%d\n",fz,fm);
}
return ;
}
【点分治练习题·不虚就是要AK】点分治的更多相关文章
- 点分治练习:不虚就是要AK
[题面] 不虚就是要AK(czyak.c/.cpp/.pas) 2s 128M czy很火.因为又有人说他虚了.为了证明他不虚,他决定要在这次比赛AK. 现在他正在和别人玩一个游戏:在一棵树上随机取两 ...
- NOIP2016模拟赛三 Problem C: 不虚就是要AK
题目大意 给定一棵带有边权的树, 问你在树上随机选两个点, 它们最短路径上的边权之和为\(4\)的倍数的概率为多少. Solution 树分治. 没什么好讲的. #include <cstdio ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- UOJ347 WC2018 通道 边分治、虚树
传送门 毒瘤数据结构题qwq 设三棵树分别为$T1,T2,T3$ 先将$T1$边分治,具体步骤如下: ①多叉树->二叉树,具体操作是对于每一个父亲,建立与儿子个数相同的虚点,将父亲与这些虚点穿成 ...
- LOJ 2339 「WC2018」通道——边分治+虚树
题目:https://loj.ac/problem/2339 两棵树的话,可以用 CTSC2018 暴力写挂的方法,边分治+虚树.O(nlogn). 考虑怎么在这个方法上再加一棵树.发现很难弄. 看了 ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- 洛谷P4220 [WC2018]通道(边分治+虚树)
题面 传送门 题解 代码不就百来行么也不算很长丫 虽然这题随机化贪心就可以过而且速度和正解差不多不过我们还是要好好学正解 前置芝士 边分治 米娜应该都知道点分治是个什么东西,而边分治,顾名思义就是对边 ...
- 一篇自己都看不懂的点分治&点分树学习笔记
淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...
随机推荐
- <Effective C++>读书摘要--Ctors、Dtors and Assignment Operators<一>
<Item 5> Know what functions C++ silently writes and calls 1.If you don't declare them yoursel ...
- node必学的Hello World实现--服务器实现
node是JavaScript运行在后端的一种实现.而后端语言,不管是php,java都需要一个服务器才能跑起来,node如是. node的服务器较php而言,少了单独安装服务器的步骤,node的服务 ...
- Gitkraken系列-Gitkraken使用操作
一个优秀的团队合作离不开git,一个优秀的程序员也离不开git.gitkraken是我在进行软工实践这门课接触到的git的UI界面的工具,它给我留下的印象就是非常好用和方便 怎么个方便法呢? 方便的安 ...
- C#下Label的多行显示
效果如图 1. tableLayout 三行两列 第一行 存放二维码的信息 第二行空白,用于分割 第三行存储LOGO信息 2. Lable4个,Dock属性都为Fill 第一列TextAlign使用M ...
- mysql+navicat安装小结
1,mysql到官方下载,navicat下载破解版 2,修改my.ini, 注意,需要手动创建data文件夹, 其中C:\MySql\mysql-5.7.17-winx64是解压mysql的目录 [m ...
- Tomcat 7优化配置
Tomcat 的优化不像其它软件那样,简简单单的修改几个参数就可以了,它的优化主要有三方面,分为系统优化,Tomcat 本身的优化,Java 虚拟机(JVM)调优.系统优化就不在介绍了,接下来就详细的 ...
- bsxfun函数
函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间元素逐个计算的二值操作,fun是函数句柄或者m文件,也可以为如下内置函数: @plus 加@m ...
- Socket_SSH-2(大文件的一次传输)
import socket,os server=socket.socket() server.bind(('localhost',9999)) server.listen() while True: ...
- 2015 EC L - Multiplication Table
/************************************************************************* > File Name: L.cpp > ...
- [GDOI2014]拯救莫莉斯 状压DP
题面: 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市( 1\le x\l ...