luogu P2634 [国家集训队]聪聪可可 点分治
Description
聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树)。并且每条“边”上都有一个数。接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所有边上数的和加起来恰好是3的倍数,则判聪聪赢,否则可可赢。聪聪非常爱思考问题,在每次游戏后都会仔细研究这棵树,希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。
Input
输入的第1行包含1个正整数n。后面n-1行,每行3个整数x、y、w,表示x号点和y号点之间有一条边,上面的数是w。
Output
以即约分数形式输出这个概率(即“a/b”的形式,其中a和b必须互质。如果概率为1,输出“1/1”)。
题解:
没啥难度,只需将路径取模,开桶,统计 d[0],d[1],d[2] 的值即可.
ans = d[1]*d[2]*d[2]+d[0]*d[0]
Code:
#include<bits/stdc++.h>
#define maxn 20002
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int head[maxn],to[maxn],nex[maxn],val[maxn],siz[maxn];
int d[maxn],f[maxn],vis[maxn],dep[maxn];
int cnt,tot,sn,n,ans,root;
void add(int u,int v,int c){
nex[++cnt]=head[u],head[u]=cnt,to[cnt]=v,val[cnt]=c;
}
void getdis(int u,int fa){
++d[dep[u]];
for(int v=head[u];v;v=nex[v]){
if(to[v]==fa||vis[to[v]]) continue;
dep[to[v]]=(dep[u]+val[v])%3,getdis(to[v],u);
}
}
int calc(int u){
d[0]=d[1]=d[2]=0;
getdis(u,0);
return d[0]*d[0]+d[1]*d[2]*2;
}
void getroot(int u,int fa){
siz[u]=1,f[u]=0;
for(int v=head[u];v;v=nex[v]){
if(to[v]==fa||vis[to[v]]) continue;
getroot(to[v],u);
f[u]=max(f[u],siz[to[v]]);
siz[u]+=siz[to[v]];
}
f[u]=max(f[u],sn-siz[u]);
if(f[u]<f[root]) root=u;
}
void dfs(int u){
vis[u]=1;
dep[u]=0;
ans+=calc(u);
for(int v=head[u];v;v=nex[v])
if(!vis[to[v]]){
dep[to[v]]=val[v]%3;
ans-=calc(to[v]);
sn=siz[to[v]],root=0;
getroot(to[v],0);
dfs(root);
}
}
int gcd(int a,int b){ return !b ? a : gcd(b,a%b); }
int main(){
// setIO("input");
scanf("%d",&n);
for(int i=1,a,b,c;i<n;++i) scanf("%d%d%d",&a,&b,&c),add(a,b,c%3),add(b,a,c%3);
f[0]=0x7f7f7f7f; cnt=0,root=0;
getroot(1,0),dfs(root);
if(!ans) printf("0/0");
else {
int c=n*n, p=gcd(ans,n*n);
ans/=p,c/=p;
printf("%d/%d",ans,c);
}
return 0;
}
luogu P2634 [国家集训队]聪聪可可 点分治的更多相关文章
- [LUOGU] P2634 [国家集训队]聪聪可可
点分治裸题,甚至不需要栈回撤. 尝试用容斥写了一波,就是把所有子树混一块计算,最后减去子树内路径条数. #include<iostream> #include<cstring> ...
- BZOJ 2152 / Luogu P2634 [国家集训队]聪聪可可 (点分治/树形DP)
题意 一棵树,给定边权,求满足两点之间的路径上权值和为3的倍数的点对数量. 分析 点分治板题,对每个重心求子树下面的到根的距离模3分别为0,1,2的点的个数就行了. O(3nlogn)O(3nlogn ...
- bzoj2152 / P2634 [国家集训队]聪聪可可(点分治)
P2634 [国家集训队]聪聪可可 淀粉质点分治板子 边权直接 mod 3 直接点分治统计出所有的符合条件的点对再和总方案数约分 至于约分.....gcd搞搞就好辣 #include<iostr ...
- 洛谷 P2634 [国家集训队]聪聪可可 解题报告
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一 ...
- 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- P2634 [国家集训队]聪聪可可(题解)(点分治)
P2634 [国家集训队]聪聪可可(题解)(点分治) 洛谷题目 #include<iostream> #include<cstdlib> #include<cstdio& ...
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- luogu P2757 [国家集训队]等差子序列
题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...
- luogu P2619 [国家集训队2]Tree I
题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...
随机推荐
- Atcoder AGC031B Reversi (DP计数)
简单的计数题.(总算做出一道AGC的B题了,然而这场比赛我忘记打了233333) 题目链接: https://atcoder.jp/contests/agc031/tasks/agc031_b 题意: ...
- Fleury算法 求欧拉回路
Fleury算法 #include <iostream> #include <cstdio> #include <cstring> #include <cma ...
- 移位运算>>与>>>
无符号右移运算符 (>>>)右移表达式的位,不保留符号.result = expression1 >>> expression2>>>运算符把 e ...
- SLES documentation
https://www.suse.com/documentation/sles11/book_sle_admin/data/sec_basicnet_yast.html
- asp.net--CRSF
asp.net使用了token来防止CRSF攻击 前台: 使用@Html.AntiForgeryToken(); 浏览器里面被存了一个cookie值,这个值是asp.net存给浏览器的,是readon ...
- vs--bookmark用法
快捷键 Ctrl+K,K 增加/取消书签 Ctrl+K,P 导航到上一个书签 Ctrl+K,N 导航到下一个标签 Ctrl+K,L 取消所有书签
- oracle regexp_like介绍和例子
oracle regexp_like介绍和例子 学习了:http://www.cnblogs.com/einyboy/archive/2012/08/01/2617606.html ORACLE中的支 ...
- Heat-AutoScaling
在openstack的I版本号中,Heat中加入了对于AutoScaling资源的支持,github上也提供了相应的AutoScaling的模板,同一时候也支持使用ceilometer的alarm来触 ...
- hdu1209(Clock)
pid=1209">点击打开hdu1209 Problem Description There is an analog clock with two hands: an hour h ...
- APP漏洞自动化扫描专业评测报告(中篇)
前言 上一篇中通过对阿里聚安全[1].360App漏洞扫描[2].腾讯金刚审计系统[3].百度移动云测试中心[4]以及AppRisk Scanner[5] 在收费情况.样本测试后的扫描时间对比和漏洞项 ...