树分治劲啊

原题:

聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画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】 聪聪可可的更多相关文章

  1. 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), ...

  2. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  3. 【NOI2005】聪聪和可可 概率与期望 记忆化搜索

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 958[Submit][Statu ...

  4. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

  5. 【BZOJ】1415: [Noi2005]聪聪和可可【期望】【最短路】【记忆化搜索】

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2335  Solved: 1373[Submit][Stat ...

  6. 【BZOJ】【1415】【NOI2005】聪聪和可可

    数学期望+记忆化搜索 论文:<浅析竞赛中一类数学期望问题的解决方法>——汤可因  中的第一题…… Orz 黄学长 我实在是太弱,这么简单都yy不出来…… 宽搜预处理有点spfa的感觉= = ...

  7. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  8. P4206[NOI2005]聪聪与可可

    链接P4206 [NOI2005]聪聪与可可 类似于开车旅行,如果老鼠确定了那么猫的路线是确定的. 预处理\(g_{i,j}\)表示老鼠在\(i\)号点,猫的下一步方向,\(Bfs\)就行了 设\(f ...

  9. BZOJ 1415 【NOI2005】 聪聪和可可

    题目链接:聪聪和可可 一道水题--开始还看错题了,以为边带权--强行\(O(n^3)\)预处理-- 首先,我们显然可以预处理出一个数组\(p[u][v]\)表示可可在点\(u\),聪聪在点\(v\)的 ...

  10. 【bzoj1415】 Noi2005—聪聪和可可

    http://www.lydsy.com/JudgeOnline/problem.php?id=1415 (题目链接) 题意 一张图,聪聪想吃可可.每单位时间聪聪可以先移动两次:可可后移动一次或停在原 ...

随机推荐

  1. bzoj4278

    题解: 把第一个串放好,加一个oo 然后把第二个串倒序放进来 然后就是http://www.cnblogs.com/xuanyiming/p/8510231.html这一题了 代码: #include ...

  2. tidb使用坑记录

    转载自:https://www.cnblogs.com/linn/p/8459327.html tidb使用坑记录 1.对硬盘要求很高,没上SSD硬盘的不建议使用 2.不支持分区,删除数据是个大坑. ...

  3. C++标准库头文件名字和C语言头文件名字的区别

    1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...

  4. Linux U盘安装

    Ubuntu 15 U盘安装: 用UltraISO把iso文件写入到U盘中,选择hdd+模式. u盘启动后提示not a com32r image,先按tab键,然后输入live进入试用模式,然后再点 ...

  5. Cracking The Coding Interview5.2

    //Given a (decimal - e.g. 3.72) number that is passed in as a string, print the binary representatio ...

  6. 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 ...

  7. golang实现一个代理服务器(proxy)学习笔记

    golang是google公司开发一门新的编程语言.对于老的程序员来说,学习一门语言最好的方式,不过是做一个小的项目. 网上看到这一篇使用golang开发proxy的例子,觉得挺有意思.希望通过实际模 ...

  8. Python库,让你相见恨晚的第三方库

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...

  9. DHCP服务配置

    DHCP(Dynamic Host Configuration Protocol)动态主机配置协议 -->是由Internet工作任务小组设计开发的,专用于对TCP/IP网络中的计算机自定分配T ...

  10. 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 ...