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 namespace std;
 9 int p[N],pre[N],tt[N],s[N],cnt[N];
10 int n,i,a,b,j,ans,dp,sum;
11 void link(int x,int y)
12 {
13     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
14 }
15 void dfs(int x,int fa)
16 {
17     int i=p[x];
18     s[x]=1;
19     while (i)
20     {
21         if (tt[i]!=fa)
22         {
23             dfs(tt[i],x);
24             s[x]+=s[tt[i]];
25         }
26         i=pre[i];
27     }
28 }
29 int main()
30 {
31     scanf("%d",&n);
32     for (i=1;i<n;i++)
33     {
34         scanf("%d%d",&a,&b);
35         link(a,b);
36         link(b,a);
37     }
38     dfs(1,0);
39     for (i=1;i<=n;i++)
40     cnt[s[i]]++;
41     for (i=1;i<=n;i++)
42     if (n%i==0)
43     {
44         sum=0;
45         for (j=i;j<=n;j+=i)
46         sum+=cnt[j];
47         if (sum==n/i) ans++;
48     }
49     printf("%d\n",ans);
50 } 
时间: 2024-10-21 03:26:58

bzoj4401 块的计数的相关文章

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

【bzoj4401】块的计数

首先,块的大小确定的话,可以发现方案最多只有1种 然后就可以O(nsqrt(n))搞,不过会TLE 接着我们又发现,一个节点可以作一个块的根,当且仅当该节点的size能被块的大小整除 然后就可以O(nlogn)搞了 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> usi

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,而我们可以想到实际上