淀粉质

第二道点分治的题

关于点分治的一点理解:

所谓点分治,其实就是把要求的问题(一般与路径有关)划分成两种情况

1.路径经过rt(根节点)

2.路径在根节点的子树内

我们只需要处理情况1,因为情况2就是情况1的递归子问题

在这个过程中,要注意容斥原理的应用;

//--------------------------------------------------------------------------

关于此题:

w可预先%3(不会影响答案),注意乘法原理的应用;

 #include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define up(i,l,r) for(register int i = (l); i <= (r); ++i)
#define dn(i,l,r) for(register int i = (l); i >= (r); --i)
#define ll long long
#define re register
using namespace std; template <typename T> void in(T &x) {
x = ; T f = ; char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -; ch = getchar();}
while( isdigit(ch)) {x = * x + ch - ; ch = getchar();}
x *= f;
} template <typename T> void out(T x) {
if(x < ) x = -x , putchar('-');
if(x > ) out(x/);
putchar(x% + );
}
//--------------------------------------------------------- const int N = ; int n;
ll ans = ; struct edge {
int v,w,nxt;
}e[N<<];int tot,head[N]; void add(int u,int v,int w) {
e[++tot].v = v;
e[tot].w = w;
e[tot].nxt = head[u];
head[u] = tot;
} //--------------------------------------------------------- bool vis[N];
int size[N],f[N];
int Tsize,rt,dis[N];
int t[]; void get_rt(int u,int fa) {
size[u] = ; f[u] = ;
for(re int i = head[u]; i ;i = e[i].nxt) {
int v = e[i].v; if(v == fa || vis[v]) continue;
get_rt(v,u); size[u] += size[v];
f[u] = max(f[u],size[v]);
}
f[u] = max(f[u],Tsize-size[u]);
if(f[u] < f[rt]) rt = u;
} void get_dis(int u,int fa) {
++t[dis[u]%];
for(re int i = head[u]; i ;i = e[i].nxt) {
int v = e[i].v; if(v == fa || vis[v]) continue;
dis[v] = (dis[u]+e[i].w)%; get_dis(v,u);
}
} ll calc(int u) {
t[] = t[] = t[] = ;
get_dis(u,);
return t[]*t[]+*t[]*t[];
} void solve(int u) {
vis[u] = ; dis[u] = ;
ans += calc(u);
for(re int i = head[u]; i ;i = e[i].nxt) {
int v = e[i].v; if(vis[v]) continue;
dis[v] = e[i].w;
ans -= calc(v);
Tsize = size[v],rt = ,f[] = n+;
get_rt(v,); solve(rt);
}
} void init() {
memset(head,,sizeof(head));
memset(vis,,sizeof(vis));
ans = ; Tsize = n,rt = ,f[] = n+;
} ll Gcd(ll a,ll b) {return b == ? a:Gcd(b,a%b);} int main() {
init();
in(n); int x,y,w;
up(i,,n-) {
in(x); in(y); in(w); add(x,y,w%),add(y,x,w%);
//技巧 mod 3
}
get_rt(,); solve(rt);
ll gcd = Gcd(ans,1ll*n*n);
out(ans/gcd); putchar('/'); out(1ll*n*n/gcd);
return ;
}

P2634 [国家集训队]聪聪可可的更多相关文章

  1. bzoj2152 / P2634 [国家集训队]聪聪可可(点分治)

    P2634 [国家集训队]聪聪可可 淀粉质点分治板子 边权直接 mod 3 直接点分治统计出所有的符合条件的点对再和总方案数约分 至于约分.....gcd搞搞就好辣 #include<iostr ...

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

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

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

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

  4. P2634 [国家集训队]聪聪可可(题解)(点分治)

    P2634 [国家集训队]聪聪可可(题解)(点分治) 洛谷题目 #include<iostream> #include<cstdlib> #include<cstdio& ...

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

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

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

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

  7. luogu P2634 [国家集训队]聪聪可可 点分治

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

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

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

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

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

随机推荐

  1. Python 学习笔记03篇

    看着直播,想着未赶完的工作 真的很想学好一门编程语言

  2. Spring再接触 简单属性注入

    <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> <property ...

  3. 安装和使用Docker(Windows7)

    1.Boot2Docker Boot2Docker是实现Docker的软件.Windows下的Docker只适合于开发测试(大部分人也就是干开发测试的..),不适合于生产环境. Boot2Docker ...

  4. jquery中checkbox的选中,反选,全不选 注意1.6版本以上将attr改成prop

    <script type="text/javascript"> $(function () { // 全选 $("#btnCheckAll").bi ...

  5. windows系统如何安装运行filebeat

    下载安装包 下载地址:https://www.elastic.co/downloads/beats/filebeat 解压到指定目录,无需安装 打开解压后的目录,打开filebeat.yml进行配置. ...

  6. Locust 学习一 :初识

    之前就听过Locust是基于python的一款很好用的开源性能测试框架,一直没机会实践,正好这次项目上有个接口压测的小任务,就拿来练练手 安装:py -3 -m pip install locusti ...

  7. sqlserver 收缩数据库/文件

    /******************************/ 1.右键-属性-选项-简单模式 2.右键-任务-收缩-文件 3.右键-任务-收缩-数据库 /********************* ...

  8. windows 10 透明毛玻璃,winform和wpf方法

    win10的透明毛玻璃,winform和wpf方法,win7.8不能用,只是win10 public partial class Form1 : Form { [DllImport("use ...

  9. IO输入输出流

    在Java中进行文件的读写,Java IO流是必备的知识. IO流指 的是输入输出流,用来处理设备上的数据.这里的设备指硬盘,内存,键盘录入,网络传输等. 按处理数据类型来分:字节流和字符流. 按流的 ...

  10. Heroku登录问题

    second_app 这一步还没有完成,登录接口维护.