洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量
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”)。
输入输出样例
- 5
- 1 2 1
- 1 3 2
- 1 4 1
- 2 5 3
- 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开关如下所示:
- #pragma GCC optimize(2)
- 只需将这句话放到程序的开头即可打开O2优化开关。
一开始手动吸氧也没过,后来可能网络稳了,试了很多次都过了。
代码:
- //点分治
- #include<bits/stdc++.h>
- using namespace std;
- #define fin freopen("in.txt", "r", stdin)
- #define fout freopen("out.txt", "w", stdout)
- #define FI(n) FastIO::read(n)
- #pragma GCC optimize(2)//O2优化,手动吸氧才过。。。
- typedef long long ll;
- const int inf=0x3f3f3f3f;
- const int maxn=2e4+;
- const int maxm=1e7+;
- const int mod=;
- int head[maxn<<],tot;
- int root,allnode,n,m,k;
- int vis[maxn],dis[maxn],siz[maxn],maxv[maxn];//maxv为重心节点
- int ans[maxn];
- ll sum=;
- //namespace IO{
- // char buf[1<<15],*S,*T;
- // inline char gc(){
- // if (S==T){
- // T=(S=buf)+fread(buf,1,1<<15,stdin);
- // if (S==T)return EOF;
- // }
- // return *S++;
- // }
- // inline int read(){
- // int x; bool f; char c;
- // for(f=0;(c=gc())<'0'||c>'9';f=c=='-');
- // for(x=c^'0';(c=gc())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^'0'));
- // return f?-x:x;
- // }
- // inline long long readll(){
- // long long x;bool f;char c;
- // for(f=0;(c=gc())<'0'||c>'9';f=c=='-');
- // for(x=c^'0';(c=gc())>='0'&&c<='9';x=(x<<3)+(x<<1)+(c^'0'));
- // return f?-x:x;
- // }
- //}
- //using IO::read;
- //using IO::readll;
- namespace FastIO {//读入挂
- const int SIZE = << ;
- char buf[SIZE], obuf[SIZE], str[];
- int bi = SIZE, bn = SIZE, opt;
- int read(char *s) {
- while (bn) {
- for (; bi < bn && buf[bi] <= ' '; bi++);
- if (bi < bn) break;
- bn = fread(buf, , SIZE, stdin);
- bi = ;
- }
- int sn = ;
- while (bn) {
- for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
- if (bi < bn) break;
- bn = fread(buf, , SIZE, stdin);
- bi = ;
- }
- s[sn] = ;
- return sn;
- }
- bool read(int& x) {
- int n = read(str), bf;
- if (!n) return ;
- int i = ; if (str[i] == '-') bf = -, i++; else bf = ;
- for (x = ; i < n; i++) x = x * + str[i] - '';
- if (bf < ) x = -x;
- return ;
- }
- };
- ll gcd(ll a,ll b)
- {
- return b==?a:gcd(b,a%b);
- }
- struct node{
- int to,next,val;
- }edge[maxn<<];
- void add(int u,int v,int w)//前向星存图
- {
- edge[tot].to=v;
- edge[tot].next=head[u];
- edge[tot].val=w;
- head[u]=tot++;
- }
- void init()//初始化
- {
- memset(head,-,sizeof head);
- memset(vis,,sizeof vis);
- tot=;
- }
- void get_root(int u,int father)//求重心
- {
- siz[u]=;maxv[u]=;
- for(int i=head[u];~i;i=edge[i].next){
- int v=edge[i].to;
- if(v==father||vis[v]) continue;
- get_root(v,u);
- siz[u]+=siz[v];
- maxv[u]=max(maxv[u],siz[v]);
- }
- maxv[u]=max(maxv[u],allnode-siz[u]);//保存节点size
- if(maxv[u]<maxv[root]) root=u;//更新保存当前子树的重心
- }
- void get_dis(int u,int father)//获取子树所有节点与根的距离
- {
- ans[dis[u]%mod]++;//保存数量
- for(int i=head[u];~i;i=edge[i].next){
- int v=edge[i].to;
- if(v==father||vis[v]) continue;
- int w=edge[i].val;
- dis[v]=(dis[u]+w)%mod;
- get_dis(v,u);
- }
- }
- ll cal(int u,int now)//每一棵子树的计算
- {
- ans[]=ans[]=ans[]=;
- dis[u]=now;
- get_dis(u,);
- ll ret=ans[]*ans[]*+ans[]*(ans[]-)+ans[];//1的加上2的+0的
- return ret;
- }
- void solve(int u)
- {
- sum+=cal(u,);//所有满足的
- vis[u]=;
- for(int i=head[u];~i;i=edge[i].next){
- int v=edge[i].to;
- int w=edge[i].val;
- if(vis[v]) continue;
- sum-=cal(v,w);//去掉子树的,容斥思想。
- allnode=siz[v];
- root=;
- get_root(v,u);
- solve(root);
- }
- }
- int main()
- {
- // n=read();
- FI(n);
- init();
- for(int i=;i<n;i++){
- int u,v,w;
- FI(u),FI(v),FI(w);
- add(u,v,w);
- add(v,u,w);
- }
- root=;allnode=n;maxv[]=inf;
- get_root(,);
- solve(root);
- ll num=n*n;
- ll GCD=gcd(sum,num);
- printf("%lld/%lld\n",sum/GCD,num/GCD);
- }
洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量的更多相关文章
- 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)
洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...
- 洛谷 P2634 [国家集训队]聪聪可可 解题报告
P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一 ...
- 洛谷P2634 [国家集训队]聪聪可可 (点分治)
题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...
- 洛谷-P2634 [国家集训队]聪聪可可 点分治
Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...
- 洛谷P2634 [国家集训队]聪聪可可(点分治)
传送门 题意: 给出一颗树,每条边都有一定的边权. 先问点之间路径和为\(3\)的倍数的点对有多少. 思路: 点分治模板题. 可以将问题转化为经过一个点\(t\)的路径和不经过点\(t\)的路径两种情 ...
- [洛谷P2634][国家集训队]聪聪可可
题目大意:给你一棵树,随机选两个点,求它们之间路径长度是$3$的倍数的概率 题解:点分治,求出当前状态的重心,然后求出经过重心的答案,接着分治每棵子树.注意考虑重复计算的情况 卡点:无 C++ Cod ...
- 洛谷 P2634 [国家集训队]聪聪可可
点分板子2333 注释都是错过的地方 #include<cstdio> #include<algorithm> using namespace std; typedef lon ...
- 洛谷P2634 [国家集训队]聪聪可可 点分治模板
题意 在一棵树上任意选两个点,求它们距离模3为0的概率. 分析 树分治模板 Code #include<bits/stdc++.h> #define fi first #define se ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
随机推荐
- K8S学习笔记之k8s使用ceph实现动态持久化存储
0x00 概述 本文章介绍如何使用ceph为k8s提供动态申请pv的功能.ceph提供底层存储功能,cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ...
- C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)
C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳) 在使用 TcpClient 网络连接中常常会发生客户端连接异常断 ...
- Java判断两个时间相差的天数
1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 ...
- python基础--初始数据结构
目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...
- 86.使用webpack爬过的坑
Webpack 4 和单页应用入门 https://github.com/wallstreetcn/webpack-and-spa-guide
- DMA初识
功能 DMA可以在CPU不干涉的情况下,进行数据的搬移.例如:通过DMA来获取摄像头输出的像素数据,而占用少量CPU资源. DMAMUX DMAMUX负责数据的路由:将触发源绑定到特定的DMA通道,当 ...
- php + h5 实现socket推送技术
在socket出现之前已经有ajax定时请求.长轮询等方案,但都不能满足需求,socket就应用而生了. socket基本函数socket 总结下常用的socket函数 服务端: socket_cre ...
- OSPF 多区域配置
通过配置OSPF协议使网络互通. 实验拓扑 如图所示连接,地址规划如下: 名称 接口 IP地址 R1 f1/0 192.168.10.1/24 R1 f0/0 192.168.20.1/24 R1 f ...
- 百度地图公交线路查询,并绘制到地图上并获取所有路径经纬度点(可供echarts 路径图使用)
github地址 https://github.com/a1115040996/MyHTML/tree/gh-pages/BDMap 源代码 <!DOCTYPE html PUBLIC &quo ...
- jmeter 使用命令行执行
一般情况我们在设计脚本的时候,可以使用界面执行. 实际在压测的时候,我们可以使用命令行在后台执行. jmeter -n -t D:\document\bgy\jemeter\Script1.jmx - ...