[BZOJ2152]聪聪可可-点分治
来源:互联网 发布:log4j java 代码样例 编辑:程序博客网 时间:2024/04/29 04:32
2152: 聪聪可可
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”)。
Sample Input
5
1 2 1
1 3 2
1 4 1
2 5 3
Sample Output
13/25
【样例说明】
13组点对分别是(1,1) (2,2) (2,3) (2,5) (3,2) (3,3) (3,4) (3,5) (4,3) (4,4) (5,2) (5,3) (5,5)。
【数据规模】
对于100%的数据,n<=20000。
点分治~
貌似比点分治入门题还简单呢~
毕竟Tree咱可是WA过一次的呢☆~
思路:
点分治~
和同类入门题”Tree”的唯一区别就是,计算答案方便多了……
那咱还有什么可说的呢~
不明白点分治的可以看另一篇”Tree”的博客~
#include<iostream>#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;const int N=20233;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0' || '9'<ch){if(ch=='-')f=-1;ch=getchar();} while('0'<=ch && ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}inline int maxx(int a,int b){if(a>b)return a;return b;}int n;int to[N<<1],nxt[N<<1],w[N<<1],beg[N],ans,tot;int dep[N],vis[N],siz[N],mx[N],t[3],size,root;inline int add(int u,int v,int c){ to[++tot]=v; nxt[tot]=beg[u]; w[tot]=c; beg[u]=tot;}void getdep(int u,int fa){ t[dep[u]]++; for(int i=beg[u],v;i;i=nxt[i]) if((v=to[i])!=fa && !vis[v]) { dep[v]=dep[u]+w[i]; if(dep[v]>=3) dep[v]-=3; getdep(v,u); }}void getroot(int u,int fa){ siz[u]=1;mx[u]=0; for(int i=beg[u],v;i;i=nxt[i]) if((v=to[i])!=fa && !vis[v]) { getroot(v,u); siz[u]+=siz[v]; mx[u]=maxx(mx[u],siz[v]); } mx[u]=maxx(mx[u],size-siz[u]); if(mx[u]<mx[root]) root=u;}inline int calc(int u,int init=0){ t[0]=t[1]=t[2]=0; dep[u]=init; getdep(u,0); return t[0]*t[0]+t[1]*t[2]*2;}void work(int u){ ans+=calc(u); vis[u]=1; for(int i=beg[u],v;i;i=nxt[i]) { if(!vis[v=to[i]]) { ans-=calc(v,w[i]); mx[root=0]=size=siz[v]; getroot(v,0); work(root); } }}int main(){ n=read(); for(int i=1,u,v,c;i<n;i++) { u=read();v=read();c=read()%3; add(u,v,c);add(v,u,c); } mx[0]=size=n; getroot(1,0); work(root); int x=__gcd(ans,n*n); printf("%d/%d\n",ans/x,n*n/x); return 0;}
- BZOJ2152 聪聪可可(点分治)
- bzoj2152 聪聪可可【点分治】
- 【bzoj2152】【聪聪可可】【点分治】
- bzoj2152 聪聪可可 点分治
- 【bzoj2152】聪聪可可 点分治
- BZOJ2152 聪聪可可 点分治
- 【BZOJ2152】聪聪可可【点分治】
- [BZOJ2152]聪聪可可(点分治)
- bzoj2152: 聪聪可可(点分治)
- 【bzoj2152】聪聪可可 点分治
- [BZOJ2152]聪聪可可-点分治
- bzoj2152 聪聪与可可 点分治
- BZOJ2152[聪聪可可] 点分治
- BZOJ2152 聪聪可可 点分治题解
- bzoj2152: 聪聪可可(点分治)
- [BZOJ2152]聪聪可可(点分治)
- BZOJ2152: 聪聪可可 【点分治】
- 【BZOJ2152】聪聪可可(点分治)
- 锚点全屏滚动(jQuery)
- C++菜鳥的成長之路(2)——Linux下的socket編程(1)
- JavaWeb 02 Servlet
- 错误”ORA-12560: TNS: 协议适配器错误“解决方法
- 每周一本书之《Hadoop金融大数据分析》
- [BZOJ2152]聪聪可可-点分治
- 面试官谈游戏入行--面试和信仰
- 微信小程序多页面传参通信的探索与实践
- CRP小试牛刀:解决“产出物路径不存在”问题。
- elasticsearch简单使用
- 同一天面两位电子科大朋友的不同感受
- 第五次试验
- Retrofit详解
- 关于 Lua 内存泄漏的检测