P2634 [国家集训队]聪聪可可

题目描述

聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃、两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏。

他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树)。并且每条“边”上都有一个数。接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所有边上数的和加起来恰好是3的倍数,则判聪聪赢,否则可可赢。

聪聪非常爱思考问题,在每次游戏后都会仔细研究这棵树,希望知道对于这张图自己的获胜概率是多少。现请你帮忙求出这个值以验证聪聪的答案是否正确。

输入格式

输入的第1行包含1个正整数n。后面n-1行,每行3个整数x、y、w,表示x号点和y号点之间有一条边,上面的数是w。

输出格式

以即约分数形式输出这个概率(即“a/b”的形式,其中a和b必须互质。如果概率为1,输出“1/1”)。

输入输出样例

输入 #1复制

  1. 5
  2. 1 2 1
  3. 1 3 2
  4. 1 4 1
  5. 2 5 3
输出 #1复制

  1. 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。

题意就是找树上任意两点路径为3的倍数的路径数,除以所有路径数。

点分治,最后两组数据怎么也过不了,今天过了。

换了个读入挂,也不行,手动吸氧过了。

不知道为什么老是超时,有点躁。

关于C++手动开O2优化:

  • O2优化能使程序的编译效率大大提升

  • 从而减少程序的运行时间,达到优化的效果。

  • C++程序中的O2开关如下所示:

    1. #pragma GCC optimize(2)
  • 只需将这句话放到程序的开头即可打开O2优化开关。

一开始手动吸氧也没过,后来可能网络稳了,试了很多次都过了。

代码:

  1. //点分治
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define fin freopen("in.txt", "r", stdin)
  5. #define fout freopen("out.txt", "w", stdout)
  6. #define FI(n) FastIO::read(n)
  7. #pragma GCC optimize(2)//O2优化,手动吸氧才过。。。
  8. typedef long long ll;
  9. const int inf=0x3f3f3f3f;
  10. const int maxn=2e4+;
  11. const int maxm=1e7+;
  12. const int mod=;
  13.  
  14. int head[maxn<<],tot;
  15. int root,allnode,n,m,k;
  16. int vis[maxn],dis[maxn],siz[maxn],maxv[maxn];//maxv为重心节点
  17. int ans[maxn];
  18. ll sum=;
  19.  
  20. //namespace IO{
  21. // char buf[1<<15],*S,*T;
  22. // inline char gc(){
  23. // if (S==T){
  24. // T=(S=buf)+fread(buf,1,1<<15,stdin);
  25. // if (S==T)return EOF;
  26. // }
  27. // return *S++;
  28. // }
  29. // inline int read(){
  30. // int x; bool f; char c;
  31. // for(f=0;(c=gc())<'0'||c>'9';f=c=='-');
  32. // for(x=c^'0';(c=gc())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^'0'));
  33. // return f?-x:x;
  34. // }
  35. // inline long long readll(){
  36. // long long x;bool f;char c;
  37. // for(f=0;(c=gc())<'0'||c>'9';f=c=='-');
  38. // for(x=c^'0';(c=gc())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^'0'));
  39. // return f?-x:x;
  40. // }
  41. //}
  42. //using IO::read;
  43. //using IO::readll;
  44.  
  45. namespace FastIO {//读入挂
  46. const int SIZE = << ;
  47. char buf[SIZE], obuf[SIZE], str[];
  48. int bi = SIZE, bn = SIZE, opt;
  49. int read(char *s) {
  50. while (bn) {
  51. for (; bi < bn && buf[bi] <= ' '; bi++);
  52. if (bi < bn) break;
  53. bn = fread(buf, , SIZE, stdin);
  54. bi = ;
  55. }
  56. int sn = ;
  57. while (bn) {
  58. for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
  59. if (bi < bn) break;
  60. bn = fread(buf, , SIZE, stdin);
  61. bi = ;
  62. }
  63. s[sn] = ;
  64. return sn;
  65. }
  66. bool read(int& x) {
  67. int n = read(str), bf;
  68.  
  69. if (!n) return ;
  70. int i = ; if (str[i] == '-') bf = -, i++; else bf = ;
  71. for (x = ; i < n; i++) x = x * + str[i] - '';
  72. if (bf < ) x = -x;
  73. return ;
  74. }
  75. };
  76.  
  77. ll gcd(ll a,ll b)
  78. {
  79. return b==?a:gcd(b,a%b);
  80. }
  81.  
  82. struct node{
  83. int to,next,val;
  84. }edge[maxn<<];
  85.  
  86. void add(int u,int v,int w)//前向星存图
  87. {
  88. edge[tot].to=v;
  89. edge[tot].next=head[u];
  90. edge[tot].val=w;
  91. head[u]=tot++;
  92. }
  93.  
  94. void init()//初始化
  95. {
  96. memset(head,-,sizeof head);
  97. memset(vis,,sizeof vis);
  98. tot=;
  99. }
  100.  
  101. void get_root(int u,int father)//求重心
  102. {
  103. siz[u]=;maxv[u]=;
  104. for(int i=head[u];~i;i=edge[i].next){
  105. int v=edge[i].to;
  106. if(v==father||vis[v]) continue;
  107. get_root(v,u);
  108. siz[u]+=siz[v];
  109. maxv[u]=max(maxv[u],siz[v]);
  110. }
  111. maxv[u]=max(maxv[u],allnode-siz[u]);//保存节点size
  112. if(maxv[u]<maxv[root]) root=u;//更新保存当前子树的重心
  113. }
  114.  
  115. void get_dis(int u,int father)//获取子树所有节点与根的距离
  116. {
  117. ans[dis[u]%mod]++;//保存数量
  118. for(int i=head[u];~i;i=edge[i].next){
  119. int v=edge[i].to;
  120. if(v==father||vis[v]) continue;
  121. int w=edge[i].val;
  122. dis[v]=(dis[u]+w)%mod;
  123. get_dis(v,u);
  124. }
  125. }
  126.  
  127. ll cal(int u,int now)//每一棵子树的计算
  128. {
  129. ans[]=ans[]=ans[]=;
  130. dis[u]=now;
  131. get_dis(u,);
  132. ll ret=ans[]*ans[]*+ans[]*(ans[]-)+ans[];//1的加上2的+0的
  133. return ret;
  134. }
  135.  
  136. void solve(int u)
  137. {
  138. sum+=cal(u,);//所有满足的
  139. vis[u]=;
  140. for(int i=head[u];~i;i=edge[i].next){
  141. int v=edge[i].to;
  142. int w=edge[i].val;
  143. if(vis[v]) continue;
  144. sum-=cal(v,w);//去掉子树的,容斥思想。
  145. allnode=siz[v];
  146. root=;
  147. get_root(v,u);
  148. solve(root);
  149. }
  150. }
  151.  
  152. int main()
  153. {
  154. // n=read();
  155. FI(n);
  156. init();
  157. for(int i=;i<n;i++){
  158. int u,v,w;
  159. FI(u),FI(v),FI(w);
  160. add(u,v,w);
  161. add(v,u,w);
  162. }
  163. root=;allnode=n;maxv[]=inf;
  164. get_root(,);
  165. solve(root);
  166. ll num=n*n;
  167. ll GCD=gcd(sum,num);
  168. printf("%lld/%lld\n",sum/GCD,num/GCD);
  169. }

洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量的更多相关文章

  1. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  2. 洛谷 P2634 [国家集训队]聪聪可可 解题报告

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一 ...

  3. 洛谷P2634 [国家集训队]聪聪可可 (点分治)

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  4. 洛谷-P2634 [国家集训队]聪聪可可 点分治

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  5. 洛谷P2634 [国家集训队]聪聪可可(点分治)

    传送门 题意: 给出一颗树,每条边都有一定的边权. 先问点之间路径和为\(3\)的倍数的点对有多少. 思路: 点分治模板题. 可以将问题转化为经过一个点\(t\)的路径和不经过点\(t\)的路径两种情 ...

  6. [洛谷P2634][国家集训队]聪聪可可

    题目大意:给你一棵树,随机选两个点,求它们之间路径长度是$3$的倍数的概率 题解:点分治,求出当前状态的重心,然后求出经过重心的答案,接着分治每棵子树.注意考虑重复计算的情况 卡点:无 C++ Cod ...

  7. 洛谷 P2634 [国家集训队]聪聪可可

    点分板子2333 注释都是错过的地方 #include<cstdio> #include<algorithm> using namespace std; typedef lon ...

  8. 洛谷P2634 [国家集训队]聪聪可可 点分治模板

    题意 在一棵树上任意选两个点,求它们距离模3为0的概率. 分析 树分治模板 Code #include<bits/stdc++.h> #define fi first #define se ...

  9. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

随机推荐

  1. K8S学习笔记之k8s使用ceph实现动态持久化存储

    0x00 概述 本文章介绍如何使用ceph为k8s提供动态申请pv的功能.ceph提供底层存储功能,cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ...

  2. C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)

    C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳) 在使用 TcpClient 网络连接中常常会发生客户端连接异常断 ...

  3. Java判断两个时间相差的天数

    1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的   ...

  4. python基础--初始数据结构

    目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...

  5. 86.使用webpack爬过的坑

    Webpack 4 和单页应用入门   https://github.com/wallstreetcn/webpack-and-spa-guide

  6. DMA初识

    功能 DMA可以在CPU不干涉的情况下,进行数据的搬移.例如:通过DMA来获取摄像头输出的像素数据,而占用少量CPU资源. DMAMUX DMAMUX负责数据的路由:将触发源绑定到特定的DMA通道,当 ...

  7. php + h5 实现socket推送技术

    在socket出现之前已经有ajax定时请求.长轮询等方案,但都不能满足需求,socket就应用而生了. socket基本函数socket 总结下常用的socket函数 服务端: socket_cre ...

  8. OSPF 多区域配置

    通过配置OSPF协议使网络互通. 实验拓扑 如图所示连接,地址规划如下: 名称 接口 IP地址 R1 f1/0 192.168.10.1/24 R1 f0/0 192.168.20.1/24 R1 f ...

  9. 百度地图公交线路查询,并绘制到地图上并获取所有路径经纬度点(可供echarts 路径图使用)

    github地址 https://github.com/a1115040996/MyHTML/tree/gh-pages/BDMap 源代码 <!DOCTYPE html PUBLIC &quo ...

  10. jmeter 使用命令行执行

    一般情况我们在设计脚本的时候,可以使用界面执行. 实际在压测的时候,我们可以使用命令行在后台执行. jmeter -n -t D:\document\bgy\jemeter\Script1.jmx - ...