AC日记——【模板】点分治(聪聪可可) 洛谷 P2634

【模板】点分治(聪聪可可)

思路:

  点分治;

  (感谢灯神)

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 20005
#define INF 0x7fffffff
int n,m,sum,num,cnt,ans,L,root,t;
int head[maxn],vis[maxn],d[maxn];
int size[maxn],lar[maxn],flag[4];
int E[maxn<<1],V[maxn<<1],W[maxn<<1];
inline void in(int &now)
{
    char Cget=getchar();now=0;
    while(Cget>‘9‘||Cget<‘0‘)Cget=getchar();
    while(Cget>=‘0‘&&Cget<=‘9‘)
    {
        now=now*10+Cget-‘0‘;
        Cget=getchar();
    }
}
inline void edge_add(int u,int v,int w)
{
    E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;
    E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;
}
inline int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
void GetRoot(int now,int fa)
{
    size[now]=1,lar[now]=0;
    for(int i=head[now];i;i=E[i])
    {
        if(V[i]==fa||vis[V[i]]) continue;
        GetRoot(V[i],now);
        size[now]+=size[V[i]];
        lar[now]=max(lar[now],size[V[i]]);
    }
    lar[now]=max(lar[now],sum-size[now]);
    if(lar[now]<lar[root]) root=now;
}
void GetDeep(int now,int fa)
{
    flag[d[now]]++;
    for(int i=head[now];i;i=E[i])
    {
        if(vis[V[i]]||V[i]==fa)continue;
        d[V[i]]=(d[now]+W[i])%3;
        GetDeep(V[i],now);
    }
}
int cal(int now,int dis)
{
    d[now]=dis,flag[0]=flag[1]=flag[2]=0;
    GetDeep(now,0);
    return flag[1]*flag[2]*2+flag[0]*flag[0];
}
void work(int now)
{
    ans+=cal(now,0),vis[now]=1;
    for(int i=head[now];i;i=E[i])
    {
        if(vis[V[i]]) continue;
        ans-=cal(V[i],W[i]);
        root=0,sum=size[V[i]];
        GetRoot(V[i],0),work(root);
    }
}
int main()
{
    in(n);int u,v,w;
    for(int i=1;i<n;i++)
    {
        in(u),in(v),in(w);
        edge_add(u,v,w%3);
    }
    sum=n,lar[0]=n+1;
    GetRoot(1,0),work(root);
    t=gcd(ans,n*n);
    printf("%d/%d\n",ans/t,n*n/t);
    return 0;
}
时间: 2024-10-14 18:48:53

AC日记——【模板】点分治(聪聪可可) 洛谷 P2634的相关文章

AC日记——[USACO5.4]奶牛的电信Telecowmunication 洛谷 P1345

[USACO5.4]奶牛的电信Telecowmunication 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 205 #define maxm 20005 #define INF 0x3f3f3f3f int head[maxn],cnt=1,n,m,E[m

AC日记——[USACO08DEC]干草出售Hay For Sale 洛谷 P2925

题目描述 Farmer John suffered a terrible loss when giant Australian cockroaches ate the entirety of his hay inventory, leaving him with nothing to feed the cows. He hitched up his wagon with capacity C (1 <= C <= 50,000) cubic units and sauntered over t

AC日记——欧几里得的游戏 洛谷 P1290

题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数不能小于0.然后是Ollie,对刚才得到的数,和M,N中较小的那个数,再进行同样的操作……直到一个人得到了0,他就取得了胜利.下面是他们用(25,7)两个数游戏的过程: Start:25 7 Stan:11 7 Ollie:4 7 Stan:4 3 Ollie:1 3 Stan:1 0 Stan赢得

洛谷 P2634 BZOJ 2152 【模板】点分治(聪聪可可)

题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏. 他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“点”,并用n-1条“边”把这n个“点”恰好连通(其实这就是一棵树).并且每条“边”上都有一个数.接下来由聪聪和可可分别随即选一个点(当然他们选点时是看不到这棵树的),如果两个点之间所有边上数的和

bzoj 2152 聪聪可可(点分治模板)

2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 3194  Solved: 1647[Submit][Status][Discuss] Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏

bzoj 2152: 聪聪可可 树的点分治

2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 485  Solved: 251[Submit][Status] Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏:由爸爸在纸上画n个“

BZOJ 2152: 聪聪可可 [点分治]

2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 2424  Solved: 1277[Submit][Status][Discuss] Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏

点分治2152 聪聪可可

/*点分治 将点一个一个讨论,找重心,讨论根节点,分别讨论子树.2152: 聪聪可可 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1400 Solved: 703[Submit][Status][Discuss]Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏

【cogs1863】【聪聪可可】【点分治】

[问题描述] 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)--遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏: 由爸爸在纸上画n个"点",并用n-1条"边"把这n个"点"恰好连通(其实这就是一棵树).并且每条"边"上都有一个数.接下来由聪聪和可可分别随