点分治练习:不虚就是要AK
【题面】
不虚就是要AK(czyak.c/.cpp/.pas)
2s 128M
czy很火。因为又有人说他虚了。为了证明他不虚,他决定要在这次比赛AK。
现在他正在和别人玩一个游戏:在一棵树上随机取两个点,如果这两个点的距离是4的倍数,那么算czy赢,否则对方赢。现在czy想知道他能获胜的概率。
以即约分数形式输出这个概率(即“a/b”的形式,其中a和b必须互质。如果概率为1,输出“1/1”)。
本题多组数据。对于每组数据:第一行一个数n,表示树上的节点个数 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 当n=0时表示读入结束
数据组数不超过10
输入数据
5
1 2 1
1 3 2
1 4 1
2 5 3
0
输出数据
7/25
数据范围
数据点 | n的规模 | 数据组数 | 随机生成数据 |
1 | 200 | 1 | 是 |
2 | 200 | 1 | 是 |
3 | 200 | <=3 | 是 |
4 | 2000 | <=3 | 是 |
5 | 2000 | <=3 | 是 |
6 | 2000 | <=5 | 是 |
7 | 20000 | <=5 | 否 |
8 | 20000 | <=5 | 否 |
9 | 20000 | <=10 | 否 |
10 | 20000 | <=10 | 否 |
【思路】
考虑过树根的情况。
设sum[i]表示前S-1棵子树中dis%4=i的点数,tmp代表当前S子树。
一遍dfs求出dis后累计答案即可。
需要注意的是点对算两次而且路长0算作4的倍数。
【代码】
- #include<cstdio>
- #include<vector>
- #include<queue>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
- using namespace std;
- const int N = +;
- struct Edge {
- int v,w;
- Edge(int v=,int w=) :v(v),w(w){}
- };
- vector<Edge> g[N];
- int n,m,k,ans;
- int root,size,siz[N],dis[N],f[N],vis[N];
- int gcd(int x,int y) { return y==? x:gcd(y,x%y); }
- void getroot(int u,int fa) {
- siz[u]=; f[u]=;
- for(int i=;i<g[u].size();i++) {
- int v=g[u][i].v;
- if(v!=fa && !vis[v]) {
- getroot(v,u);
- siz[u]+=siz[v];
- if(siz[v]>f[u]) f[u]=siz[v];
- }
- }
- f[u]=max(f[u],size-siz[u]);
- if(f[u]<f[root]) root=u;
- }
- int tmp[],sum[];
- void dfs(int u,int fa) {
- tmp[dis[u]]++;
- for(int i=;i<g[u].size();i++) {
- int v=g[u][i].v;
- if(v!=fa && !vis[v]) {
- dis[v]=(dis[u]+g[u][i].w)%;
- dfs(v,u);
- }
- }
- }
- void solve(int u) {
- memset(sum,,sizeof(sum));
- vis[u]=; sum[]=;
- for(int i=;i<g[u].size();i++) {
- int v=g[u][i].v;
- if(!vis[v]) {
- dis[v]=g[u][i].w%;
- dfs(v,u);
- for(int j=;j<;j++)
- ans+=tmp[j]*sum[(-j)%];
- for(int j=;j<;j++)
- sum[j]+=tmp[j],tmp[j]=;
- }
- }
- for(int i=;i<g[u].size();i++) {
- int v=g[u][i].v;
- if(!vis[v]) {
- size=siz[v]; root=;
- getroot(v,-); solve(root);
- }
- }
- }
- void read(int& x) {
- char c=getchar(); int f=; x=;
- while(!isdigit(c)){if(c=='-') c=-; c=getchar();}
- while(isdigit(c)) x=x*+c-'',c=getchar();
- x*=f;
- }
- int main() {
- //freopen("in.in","r",stdin);
- //freopen("out.out","w",stdout);
- while(read(n),n!=) {
- ans=;
- FOR(i,,n) g[i].clear();
- memset(vis,,sizeof(vis));
- int u,v,w;
- FOR(i,,n-) {
- read(u),read(v),read(w);
- g[u].push_back(Edge(v,w));
- g[v].push_back(Edge(u,w));
- }
- root=; f[]=1e9; size=n;
- getroot(,-) , solve(root);
- int b=n*n; ans=ans*+n;
- int gc=gcd(ans,b);
- printf("%d/%d\n",ans/gc,b/gc);
- }
- return ;
- }
点分治练习:不虚就是要AK的更多相关文章
- 【点分治练习题·不虚就是要AK】点分治
不虚就是要AK(czyak.c/.cpp/.pas) 2s 128M by zhb czy很火.因为又有人说他虚了.为了证明他不虚,他决定要在这次比赛AK. 现在他正在和别人玩一个游戏:在一棵树上 ...
- NOIP2016模拟赛三 Problem C: 不虚就是要AK
题目大意 给定一棵带有边权的树, 问你在树上随机选两个点, 它们最短路径上的边权之和为\(4\)的倍数的概率为多少. Solution 树分治. 没什么好讲的. #include <cstdio ...
- BZOJ刷题指南(转)
基础(65) 巨水无比(4):1214.3816:2B题:1000A+B:2462:输出10个1 模拟/枚举/暴力(15):4063傻子模拟:1968小学生暴力:1218前缀和暴力:3856读英文:4 ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- UOJ#347. 【WC2018】通道 边分治 虚树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ347.html 题意 有三棵树,边有边权. 对于所有点对 (x,y) 求在三棵树上 x 到 y 的距离之和 ...
- 【CTSC2018】暴力写挂(边分治,虚树)
[CTSC2018]暴力写挂(边分治,虚树) 题面 UOJ BZOJ 洛谷 题解 发现第二棵树上的\(LCA\)的深度这玩意没法搞,那么枚举在第二棵树上的\(LCA\). 然后剩下的部分就是\(dep ...
- 【WC2018】通道(边分治,虚树,动态规划)
[WC2018]通道(边分治,虚树,动态规划) 题面 UOJ 洛谷 题解 既然是三棵树,那么显然就是找点什么东西来套个三层. 一棵树怎么做?入门dp. 两棵树?假设在第一棵树中的深度为\(dep\). ...
随机推荐
- nodejs -formidable模块实现图片上传。
var form = new formidable.IncomingForm(); form.uploadDir="/localnonobank/test/images/"; ...
- jQuery选择器(一)
1.#id根据给定的ID匹配一个元素. <div id="notMe"><p>id="notMe"</p></div& ...
- 在Apache下开启SSI配置支持include shtml html和快速配置服务器
作为前端开发,使用Apache快速搭建服务器极为方便. 1.找到apach安装目录,找到conf目录下 的httpd.conf 使用SSI(Server Side Include)的html文件扩展名 ...
- TDirectory.GetAttributes、TDirectory.SetAttributes获取和设置文件夹属性
使用函数: System.IOUtils.TDirectory.GetAttributes//获取属性 System.IOUtils.TDirectory.SetAttributes//设置属性 注: ...
- python类库26[web2py之基本概念]
一 web2py的应用的执行环境Models,Controllers和views所在的执行环境中,以下对象已经被默认地导入: Global Objects: request,response,ses ...
- 【Python网络爬虫三】 爬去网页新闻
学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...
- 【转载】C# Tutorial - Simple Threaded TCP Server
http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server In this tutorial I'm going t ...
- m个苹果放在n个筐里,每个筐至少一个,所有的筐都一样,有多少种放法
package com.study; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- 12个你未必知道的CSS小知识
虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...
- PS仿制图章
颜色总不对,和周围不太搭配,这时候把流量调小点,然后用渐变工具.自己实践所得.