【bzoj4401】块的计数

首先,块的大小确定的话,可以发现方案最多只有1种

然后就可以O(nsqrt(n))搞,不过会TLE

接着我们又发现,一个节点可以作一个块的根,当且仅当该节点的size能被块的大小整除

然后就可以O(nlogn)搞了

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

#define N 1000010

struct edge
{
    int to,next;
}e[N<<1];
int head[N<<1];
int cnt;

int n;
int x,y;
int ans;

int f[N],p[N];

void link(int x,int y)
{
    e[++cnt]=(edge){y,head[x]};
    head[x]=cnt;
}

void dfs(int x,int d)
{
    f[x]=1;
    for (int i=head[x];i;i=e[i].next)
        if (e[i].to!=d)
        {
            dfs(e[i].to,x);
            f[x]+=f[e[i].to];
        }
    p[f[x]]++;
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<n;i++)
        scanf("%d%d",&x,&y),link(x,y),link(y,x);
    dfs(1,0);
    for (int i=1;i<=n;i++)
    {
        for (int j=i<<1;j<=n;j+=i)
            p[i]+=p[j];
        if (i*p[i]==n)
            ans++;
    }
    printf("%d",ans);
    return 0;
}

  

时间: 2024-10-28 10:33:12

【bzoj4401】块的计数的相关文章

bzoj4401 块的计数

首先确定一个根后dfs一遍,统计出每个子树的点数个数,然后枚举n的因子x,统计多少子树的点数个数是当前枚举因子x的倍数,如果有n/x个子树满足条件,则答案+1 代码 1 #include<cstdio> 2 #include<algorithm> 3 #include<set> 4 #define fi first 5 #define sc second 6 #define mp make_pair 7 #define N 2000100 8 using namespa

bzoj 4401 块的计数 思想+模拟+贪心

块的计数 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 455  Solved: 261[Submit][Status][Discuss] Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是对把树分块这个操作感到十分好奇.他想,假如能把一棵树分成几块,使得每个块中的点数都相同该有多优美啊!小Y很想知

块奖励计数及其状态平衡

一.EOS的奖励制度??对记账节点的经济激励机制是区块链项目不可缺少的重要组成部分,EOS则是通过增发的方式来给予节点奖励,支付其工资.每年增发的EOS比率为5%左右,按照总供应量10亿来计算,就是五千万EOS. 通胀的EOS用途: ??如上图,通胀的EOS币先发行到系统账户eosio中,其中的20%, 用于节点奖励:另外80%,用于EOS基金池,会在未来用于社区福利应用或者对EOS系统有所帮助的项目.该部分资金存入eosio.saving系统账户中.??EOS节点分为两类:出块节点(Block

bzoj 4401: 块的计数

根据块状树的那堆理论可以发现,对于某种块大小,可行的分法只有一种 如果一个点能被当成块顶,仅当其子树大小是块大小的倍数 于是枚举块的大小\(i\),当可行的块顶个数大于等于\(n / i\)时,就可以构造出可行的分法了 时间复杂度 \(O(\sum_{d|n}d)\) #include <bits/stdc++.h> #define N 2010000 using namespace std; int n; int lt[N], bi[N], nt[N], tl; int si[N], ai[

HDU 5441 Travel (并查集+数学+计数)

题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u到城市w的长度e1≤d,同时城市w到城市v的长度e2≤d). 析:一开始的时候,题意都读错了,怎么看都不对,原来是只要最大的d小于等于x就可以,过了好几天才知道是这样..... 这个题是并查集的应用,先从d小的开始遍历,然后去判断有几个连通块,在连通块中计数,用一个数组即可,运用排列组合的知识可以知

常用加密算法的Java实现总结(二)

常用加密算法的Java实现总结(二) ——对称加密算法DES.3DES和AES 摘自:http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html 1.对称加密算法 1.1 定义 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密

流媒体学习四------- ortp队列的实现

在ortp中实现了一个通用的队列,每一个队列包括三个实体,分别是队列.消息块和数据块,这三个实体分别对应queue_t.msgb和datab结构体. queue_t的定义如下所示: typedef struct _queue { mblk_t _q_stopper;      /* 消息队列头 */ int q_mcount;           /*number of packet in the q */ } queue_t; _q_stopper:消息块,内嵌于queue_t,它的主要作用是

SylixOS磁盘高速传输

SylixOS管线模型分析 前文主要介绍了SylixOS中的块设备CACHE管理,本章主要介绍磁盘高速传输.在CAHCE回写中SyilxOS采取了两种方式,即直接回写和多管线并发回写.并发写管线通过多线程并发处理CACHE提交的写请求,实现磁盘高速传输. SylixOS中通过LW_DISKCACHE_WP结构体管理并发写管线,该结构体的具体内容如程序清单 1-1所示. 程序清单 1-1 typedef struct {     BOOL                    DISKCWP_bE

CF679C(Bear and Square Grid) 经典好题

题目链接:传送门 题目大意:给你一个n*n包含".","X"的图,你有一次机会选择一个k*k的子矩阵,将子矩阵全部变为".",问当操作过后,得到的最大联通子块包含的"."的数目是多少. 题目思路:其实这个题自己只想到了一个暴力的思路,当然TLE没商量,但实际上正确的想法就是先dfs预处理所有"."的联通块,之后的想法技巧性太强了,        操作是模拟将子矩阵右移,直接暴力会TLE,而我们可以想到实际上