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

链接:https://www.luogu.org/problemnew/show/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: 复制
5
1 2 1
1 3 2
1 4 1
2 5 3
输出样例#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。

 

题解:点分治, 统计出 dis%3 的条数,对该点的贡献就是 tong[0] * tong[0] + tong[1] * tong[2]

这次点分又写错了,我求了重心,结果dfs的时候还是在用儿子节点

#include<bits/stdc++.h>
using namespace std;
const int M = 50005;
int h[M], siz[M], sum, Ans, tot, cnt, tong[3], dep[M], son[M], tmp[M], root; 
bool vis[M];
struct edge{int v, w, nxt;}G[M << 1];
void add(int u, int v, int w){G[++tot].v = v; G[tot].w = w; G[tot].nxt = h[u]; h[u] = tot;}
int gcd(int a, int b){return b ? gcd(b, a%b) : a;}
inline int moc(int a){return a >= 3 ? a - 3 : a;}
void getdeep(int u, int fa){for(int i = h[u]; i; i = G[i].nxt){int v = G[i].v;if(v == fa || vis[v])continue;tong[ dep[v] = moc(dep[u] + G[i].w)]++;getdeep(v, u);}
}int cal(int u, int k){int ret = 0;tong[0] = tong[1] = tong[2] = 0;tong[dep[u] = k] ++;getdeep(u, u);ret = tong[0]*tong[0] + tong[1] * tong[2] * 2;return ret;
}
void getroot(int u, int fa){siz[u] = 1; son[u] = 0;for(int i = h[u]; i; i = G[i].nxt){int v = G[i].v;if(v == fa || vis[v])continue;getroot(v, u);siz[u] += siz[v];if(siz[v] > siz[son[u]])son[u] = v;}tmp[u] = max(siz[son[u]], sum - siz[u]);if(tmp[u] < tmp[root]) root = u;
}void dfs(int u, int fa){Ans += cal(u, 0);//printf("+ %d %d\n", Ans, u);vis[u] = 1;for(int i = h[u]; i; i = G[i].nxt){int v = G[i].v;if(v == fa|| vis[v])continue;Ans -= cal(v, G[i].w);sum = siz[v]; getroot(v, root = 0);// printf("- %d %d\n", Ans, v);dfs(root, 0);}}
int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}return x*=f;
}
int main(){//freopen("1.in","r",stdin);int n;scanf("%d", &n);int u, v, w;for(int i = 1; i < n; i++){u = read(), v = read(), w = read();w %= 3;add(u, v, w), add(v, u, w);}tmp[0] = 1e9;int cc = clock();dfs(1, 0);//Ans = Ans + n;int tt = n * n;int d = gcd(tt, Ans);printf("%d/%d\n", Ans/d, tt/d);int tm = clock();//cout<<tm-cc<<endl;
}/*
10000000
6
1 2 1
1 3 2
1 4 1
2 5 3
3 6 3
*/
View Code

 

转载于:https://www.cnblogs.com/EdSheeran/p/9470026.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法 --- 快慢指针判断链表是否有环

解题思路: 分别设置2个指针(s,q)指向链表的头部,s每次指向下面一个(s s.next),q每次指向下面2个(q q.next.next). 如果存在环,q总会在某一时刻追上s /*** Definition for singly-linked list.* function ListNode(val) {* this.val val;* this.next null;* }*//**…

APP拉起小程序

结论&#xff1a;APP可以唤起小程序&#xff0c;前提是APP开发者在微信开放平台帐号下申请移动应用&#xff0c;通过审核并关联小程序&#xff0c;参考如下&#xff1a; 准备工作: APP开发者认证微信开放平台 https://kf.qq.com/faq/170824URbmau170824r2uY7j.html APP开发者…

node --- 使用nrm改变npm的源

说明: 1.nrm只是单纯的提供了几个常用的下载包的URL地址,方便我们再使用npm装包是 很方便的进行切换. 2.nrm提供的cnpm 和通过 cnpm装包是2个不同的东西(使用cnpm install必须先安装cnpm -> npm install -g cnpm) 安装nrm: // linux $ [sudo] npm install --global nrm// w…

MySQL教程(三)—— MySQL的安装与配置

1 安装MySQL 打开附件中的文件&#xff08;分别对应电脑系统为32/64位&#xff09;。点next。 三个选项&#xff0c;分别对应典型安装、自定义安装和完全安装&#xff0c;在此选择典型安装&#xff08;初学者&#xff09;。 点install。 广告&#xff0c;忽略它。 安装完成…

算法面经之百度

一、百度 前言&#xff1a;本来不打算写百度面筋的&#xff0c;因为二面表现自我感觉实在太差了&#xff0c;像是被生活抽了一记耳光&#xff0c;不愿再去揭伤疤&#xff0c;奈何&#xff0c;半个月过去了&#xff0c;昨天又被百度从备胎池拉出来涮了一遍&#xff0c;涮的时候也…

flask-session总结

一、session session和cookie的原理和区别&#xff1a; cookie是保存在浏览器上的键值对 session是存在服务端的键值对&#xff08;服务端的session就是一个大字典&#xff0c;字典中是随机字符串&#xff09;&#xff08;session与request原理相同&#xff09;&am…

c++ --- 字符串中的标点符号

题外话: 最近看node,发现node中好多强大的功能都设计到C,为了加深对node的理解,开始简单的学习一下C语法 ispunct: 统计string对象中标点符号的个数 #include <iostream> using namespace std; int main () {string s ("Hello World!");decltype(s.size()) p…

Hadoop(5)-Hive

在Hadoop的存储处理方面提供了两种不同的机制&#xff0c;一种是之前介绍过的Hbase&#xff0c;另外一种就是Hive&#xff0c;有关于Hbase&#xff0c;它是一种nosql数据库的一种&#xff0c;是一种数据库&#xff0c;基于分布式的列式存储&#xff0c;适合海量数据的操作&…

高精——模板

紫书&#xff1a; #include <iostream> #include <string> #include <cstring> #include <cstdio> using namespace std; const int maxn 1000; struct bign{ int d[maxn], len; void clean() { while(len > 1 && !d[len-1]) …

认识及实现MVC

gitee M&#xff1a;Model 数据模型&#xff08;模型层&#xff09;→ 操作数据库&#xff08;对数据进行增删改查&#xff09; V&#xff1a;View视图层 → 显示视图或视图模板 C&#xff1a;Controller 控制器层 → 逻辑层 数据和视图关联挂载和基本的逻辑操作 API层 前端请…

算法 --- 翻转二叉树

解(C): 1.二叉树判空 if(root 0) 或 if(root nullptr); 2.二叉树的左子树: root->left . 3.使用递归,将当前根节点的左右指针指向互换左向右子树(此时右子树也进行了翻转) // C /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode…

float 常见用法与问题--摘抄

float 属性绝对是众多切图仔用的最多的 CSS 属性之一&#xff0c;它的用法很简单&#xff0c;常用值就 left、right、none 三个&#xff0c;但是它的特性你真的弄懂了吗&#xff1f; 我会在这里介绍我对 float 的认识与使用&#xff0c;以及使用过程中遇到的问题。 对 float 的…

javascipt -- find方法和findIndex方法的实现

find: 根据传入的条件函数,返回符合条件的第一项 var arr [{id: 1, name: zs, age: 18},{id: 2, name: zs, age: 17},{id: 3, name: ls, age: 16},{id: 4, name: ls, age: 15}]Array.prototype._find_ function(cb){for(var i0; i< this.length; i){if(cb(this[i],i)){ret…

bzoj 2179 FFT快速傅立叶 FFT

题面 题目传送门 解法 题如其名…… 不妨将多项式的\(x^i\)变成\(10^i\)&#xff0c;然后就是一个比较简单的FFT了 md读进来的是一个字符串&#xff0c;并且要倒序 最后注意进位问题 时间复杂度&#xff1a;\(O(n\ log\ n)\) 代码 #include <bits/stdc.h> #define N 1 &l…

【探讨】javascript事件机制底层实现原理

前言 又到了扯淡时间了&#xff0c;我最近在思考javascript事件机制底层的实现&#xff0c;但是暂时没有勇气去看chrome源码&#xff0c;所以今天我来猜测一把 我们今天来猜一猜&#xff0c;探讨探讨&#xff0c;javascript底层事件机制是如何实现的 博客里面关于事件绑定与执行…

node --- 在node中使用mongoosemongoDB的安装

*首先确保,你的电脑安装了mongodb,网址: mongodb官网 *使用npm安装 mongoose: mongoose官网 ps:mongoose是Node中操作mongoDB的第三方插件.用于提高数据库操作效率(相当于在mongoDB上封装了一次,暴露出更友好的API) MongoDB的安装 1.下载地址 2.下载好了后,傻瓜式的安装(我的…

websocket demo

git node.js创建websocket 的服务 Nodejs Websocket包 ws.createServer([options], [callback]) The callback is a function which is automatically added to the “connection” event. 前端代码 1. 创建实例、打开连接 this.websocket new WebSocket(ws://127.0.0.1:80…

shell常用命令总结总结

打rpm包&#xff1a; rpmbuild -bb SPECS/smplayer.spec --define "_topdir pwd" 安装rpm包&#xff1a; rpm -ivh [rpm包文件] 如果安装不上 rpm -ivh [rpm包文件] --force #强制安装 打包的时候可能需要一些依赖&#xff1a; dnf install 【依赖文件名】 sed -i常用…

Filter

一、简介 Filter也称之为过滤器&#xff0c;它是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp&#xff0c;Servlet&#xff0c;静态图片文件或静态html文件进行拦截&#xff0c;从而实现一…

前端面试手写题

深拷贝 // 深拷贝 function deepClone(ori) {let tar;if (typeof ori object && ori ! null) {tar Array.isArray(ori) ? [] : {}for (let k in ori) {if (ori.hasOwnProperty(k)) {tar[k] deepClone(ori[k])}}} else {tar ori}return tar}继承 // 圣杯模式实现…