树分治劲啊

原题:

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

    用老毛桃自动安装Ghost版Win7的步骤: 1,到网上先下载Ghost版Win7映像文件到硬盘,我放到的是U盘,盘符为Z,如果你愿意,可直接放到硬盘即可,放到硬盘安装速度会快一点. 2,把制作好的老 ...

  2. 《Python》IO模型

    一.IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步:一件事情做完再做另一件事情 异步:同时做多件事情 阻塞:sleep.input.join.shutdown.get.acquire ...

  3. VS2010编译Unigine_2010源码

    VS2010编译Unigine_2010源码[Debug版本] 1.Laucher工程属性改为控制台项目 2.Unigine工程编译时的Warnning LNK2019 a.属性--常规-目标文件名改 ...

  4. String类的常用方法总结

    一.String类String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建 ...

  5. 进程创建过程详解 CreateProcess

    转载请您注明出处:http://www.cnblogs.com/lsh123/p/7405796.html 0x01 CreateProcessW CreateProcess的使用有ANSI版本的Cr ...

  6. 开发中最好使用not exists 取代not in

    开发中使用not in可能会存在致命的错误,在子查询中,如果存在空值,not in返回的数据就是空了,如下创建2张数据表: user表: 部门表: 现在要查询没有分配到用户的部门有哪些,使用not i ...

  7. Linux文件系统命令 ls

    名称:ls 功能:查看文件列表 renjg@renjg-HP-Compaq-Pro--MT:~$ ls add-on.yaml Desktop examples.desktop meta-gnome3 ...

  8. Flask源码阅读-第一篇(flask包下的__main__.py)

    源码: # -*- coding: utf-8 -*-""" flask.__main__ ~~~~~~~~~~~~~~ Alias for flask.run for ...

  9. lvs的FULLNAT

  10. Metasploit的射频收发器功能 | Metasploit’s RF Transceiver Capabilities

    https://community.rapid7.com/community/metasploit/blog/2017/03/21/metasploits-rf-transceiver-capabil ...