【NOI2005】 聪聪可可
树分治劲啊
原题:
聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树)。并且每条“边”上都有一个数。接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所有边上数的和加起来恰好是3的倍数,则判聪聪赢,否则可可赢。聪聪非常爱思考问题,在每次游戏后都会仔细研究这棵树,希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。
n<=20000
恩继续膜拜chty大神的题解
这题个上一题计算方式挺像的,都是树上的路径
这一次用t[0],t[1],t[2]表示路径的权值和%3为0,1,2的方案数,最后的答案就是t[1]*t[2]*2+t[0]*t[0](显然
然后和上一题基本一样,可以继续熟悉树分治的过程
有一点需要注意,getans的时候如果是为了排除在同一个子树上酱紫的不合法的情况,x的前缀和要初始化为本节点和子节点连边的权值y,这个y要么在传参的时候%3,要么就把输入中的所有权值直接%3
建议输入时权值直接%3
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int gcd(int x,int y){ return y?gcd(y,x%y):x;}
struct ddd{int y,v;}; vector <ddd> e[];
inline void ist(int x,int y,int z){ e[x].push_back((ddd){y,z});}
int n;
int cnt,rt=,ans=;
int sz[],f[],t[];
bool vst[]; int dst[];
void gtrt(int x,int fa){
sz[x]=,f[x]=;
for(int i=;i<e[x].size();++i)if(!vst[e[x][i].y] && e[x][i].y!=fa){
gtrt(e[x][i].y,x); sz[x]+=sz[e[x][i].y];
f[x]=max(f[x],sz[e[x][i].y]);
}
f[x]=max(f[x],cnt-sz[x]);
if(f[x]<f[rt]) rt=x;
}
void gtdp(int x,int fa){
++t[dst[x]];
for(int i=;i<e[x].size();++i)if(!vst[e[x][i].y] && e[x][i].y!=fa)
dst[e[x][i].y]=(dst[x]+e[x][i].v)%,gtdp(e[x][i].y,x);
}
int gtans(int x,int y){
t[]=t[]=t[]=; dst[x]=y;
gtdp(x,);
return t[]*t[]*+t[]*t[];
}
void ptt(int x){
ans+=gtans(x,); vst[x]=true;
for(int i=;i<e[x].size();++i)if(!vst[e[x][i].y]){
ans-=gtans(e[x][i].y,e[x][i].v);
rt=,gtrt(e[x][i].y,);
ptt(rt);
}
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n;
int l,r,v;
for(int i=;i<n;++i){
l=rd(),r=rd(),v=rd()%;
ist(l,r,v),ist(r,l,v);
}
cnt=n; f[]=n;
gtrt(,),ptt(rt);
int ggcd=gcd(ans,n*n);
cout<<ans/ggcd<<"/"<<n*n/ggcd<<endl;
return ;
}
【NOI2005】 聪聪可可的更多相关文章
- BZOJ 1415: [Noi2005]聪聪和可可( 最短路 + 期望dp )
用最短路暴力搞出s(i, j)表示聪聪在i, 可可在j处时聪聪会走的路线. 然后就可以dp了, dp(i, j) = [ dp(s(s(i,j), j), j) + Σdp(s(s(i,j), j), ...
- 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)
[BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...
- 【NOI2005】聪聪和可可 概率与期望 记忆化搜索
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1635 Solved: 958[Submit][Statu ...
- 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1640 Solved: 962 Description I ...
- 【BZOJ】1415: [Noi2005]聪聪和可可【期望】【最短路】【记忆化搜索】
1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2335 Solved: 1373[Submit][Stat ...
- 【BZOJ】【1415】【NOI2005】聪聪和可可
数学期望+记忆化搜索 论文:<浅析竞赛中一类数学期望问题的解决方法>——汤可因 中的第一题…… Orz 黄学长 我实在是太弱,这么简单都yy不出来…… 宽搜预处理有点spfa的感觉= = ...
- BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs
BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...
- P4206[NOI2005]聪聪与可可
链接P4206 [NOI2005]聪聪与可可 类似于开车旅行,如果老鼠确定了那么猫的路线是确定的. 预处理\(g_{i,j}\)表示老鼠在\(i\)号点,猫的下一步方向,\(Bfs\)就行了 设\(f ...
- BZOJ 1415 【NOI2005】 聪聪和可可
题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\(O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\(p[u][v]\)表示可可在点\(u\),聪聪在点\(v\)的 ...
- 【bzoj1415】 Noi2005—聪聪和可可
http://www.lydsy.com/JudgeOnline/problem.php?id=1415 (题目链接) 题意 一张图,聪聪想吃可可.每单位时间聪聪可以先移动两次:可可后移动一次或停在原 ...
随机推荐
- bzoj4278
题解: 把第一个串放好,加一个oo 然后把第二个串倒序放进来 然后就是http://www.cnblogs.com/xuanyiming/p/8510231.html这一题了 代码: #include ...
- tidb使用坑记录
转载自:https://www.cnblogs.com/linn/p/8459327.html tidb使用坑记录 1.对硬盘要求很高,没上SSD硬盘的不建议使用 2.不支持分区,删除数据是个大坑. ...
- C++标准库头文件名字和C语言头文件名字的区别
1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...
- Linux U盘安装
Ubuntu 15 U盘安装: 用UltraISO把iso文件写入到U盘中,选择hdd+模式. u盘启动后提示not a com32r image,先按tab键,然后输入live进入试用模式,然后再点 ...
- Cracking The Coding Interview5.2
//Given a (decimal - e.g. 3.72) number that is passed in as a string, print the binary representatio ...
- L267 How to save money
When it comes to saving money, the struggle is all too real. It's like your bank account and your 20 ...
- golang实现一个代理服务器(proxy)学习笔记
golang是google公司开发一门新的编程语言.对于老的程序员来说,学习一门语言最好的方式,不过是做一个小的项目. 网上看到这一篇使用golang开发proxy的例子,觉得挺有意思.希望通过实际模 ...
- Python库,让你相见恨晚的第三方库
环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...
- DHCP服务配置
DHCP(Dynamic Host Configuration Protocol)动态主机配置协议 -->是由Internet工作任务小组设计开发的,专用于对TCP/IP网络中的计算机自定分配T ...
- Strassen algorithm(O(n^lg7))
Let A, B be two square matrices over a ring R. We want to calculate the matrix product C as {\displa ...