BZOJ 3522 [Poi2014] Hotel 题解

题意:求一棵边权全都是1的树上,集合大小为3,且集合内点两两距离相等的集合个数。

NOIP2014 D1T2加强版。。

通过分析发现,满足这样的点对一定是在有根树中深度相同,且不再同一棵以根节点儿子为根的子树中。

于是我们枚举根。。

三个点的集合个数是由2个点的集合个数转移过来的。。2个又是由一个转移过来的。用两个数组保存一下即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<algorithm>
 5 #define p_b push_back
 6 const int MAXN=5000+5;
 7 std::vector<int> G[MAXN];
 8 typedef std::vector<int>::iterator vit;
 9 int n;
10 int fa[MAXN],dep[MAXN],temp[MAXN];
11 int mx;
12 void dfs(int u)
13 {
14     temp[dep[u]]++;
15     mx=std::max(mx,temp[dep[u]]);
16     for(vit e=G[u].begin();e!=G[u].end();++e) if(*e!=fa[u])
17     {
18         fa[*e]=u;
19         dep[*e]=dep[u]+1;
20         dfs(*e);
21     }
22 }
23 typedef long long LL;
24 LL t1[MAXN],t2[MAXN],ans;
25 int main()
26 {
27     //freopen("1.in","r",stdin);
28     scanf("%d",&n);
29     for(int i=0;i<n-1;++i)
30     {
31         int u,v;
32         scanf("%d%d",&u,&v);
33         G[u].p_b(v);
34         G[v].p_b(u);
35     }
36     for(int i=1;i<=n;++i)
37     {
38         memset(t1,0,sizeof(t1));
39         memset(t2,0,sizeof(t2));
40         for(vit e=G[i].begin();e!=G[i].end();++e)
41         {
42             fa[*e]=i;dep[*e]=1;
43             dfs(*e);
44             for(int j=1;j<=mx;++j)
45             {
46                 ans+=t2[j]*temp[j];
47                 t2[j]+=temp[j]*t1[j];
48                 t1[j]+=temp[j];
49             }
50             for(int j=1;j<=mx;++j) temp[j]=0;
51         }
52     }
53     printf("%lld\n",ans);
54 }

时间: 2024-10-29 08:44:07

BZOJ 3522 [Poi2014] Hotel 题解的相关文章

bzoj 3522: [Poi2014]Hotel

呵呵,一开始天真的我以为求个 西格玛 C(??,3)就好了.. (题解:比枚举2个数的再多一个,,一样搞) 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define lowbit(x) x&(-x) 4 #define inf 1e15 5 using namespace std; 6 inline int ra() 7 { 8 int x=0,f=1; char ch=getchar(); 9 while (ch<'

3522: [Poi2014]Hotel

3522: [Poi2014]Hotel Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 253  Solved: 117[Submit][Status][Discuss] Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽满意,你需要让三个房间两两距离相同.有多少种方案能让吉丽满意?

3522: [Poi2014]Hotel( 树形dp )

枚举中点x( 即选出的三个点 a , b , c 满足 dist( x , a ) = dist( x , b ) = dist( x , c ) ) , 然后以 x 为 root 做 dfs , 显然两个位于 x 的同一颗子树内的点是不可能被同时选到的 . 我们对 x 的每一颗子树进行 dfs , 记录下当前子树中的点到 x 距离为 d ( 1 <= d <= n ) 有多少个 , 记为 cnt[ 0 ][ i ] . 然后 cnt[ 1 ][ i ] 记录之前 dfs 过的子树的 cnt[

矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解

题目链接 题意:给两个长度分别为n和m的序列,现在有两种操作:1.分别选择两个序列的一个非空前缀,切两个前缀的最后一位相同,删除之,得到1分(只累计),消耗e:2.直接删除两个序列,消耗值定于两个序列之前删除的元素个数之和,并且使得得到的分有效(之前没有有效分) 分析: 首先,问题其实就是转化成,进行若干次操作1,然后进行操作2 还要找到一个判别标准,来评判较优的状态(贪心) 每次的消耗值比较大,其实可以计算出最大的删除次数,这个值不是很大 状态表示: 简单的,一个状态可以表示为串A的位置.串B

BZOJ 1~10 精简题解

从这星期起,我开始了怒刷BZOJ的旅程.这几天刷了10道题(由于"档期"的原因,所以有几道题没打完-..捂脸--..) 精简题解: 1000 A+B Problem --.. [BeiJing2006]狼抓兔子 裸的网络流,不过data有点大...... 哈,这图的性质太好了,就是一个平面图额,并且也很容易转化成对偶图,So--spfa怒跑之-- [FJOI2007]轮状病毒 Matrix-tree定理 不过,这道题有个线性递推式:f[n] = 3 * f[n - 1] – f[I -

bzoj 3198: [Sdoi2013]spring 题解

[原题] 3198: [Sdoi2013]spring Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 253  Solved: 95 Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT [题解]这道题明明是水题,坑了我两天!!!真是伤心.发现哈希都不熟练了. 首先很容易想到是2^6枚举01状态,使得1

bzoj 3246 [Ioi2013] Dreaming 题解

[原题] 3246: [Ioi2013]Dreaming Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 194  Solved: 68 Description Serpent(水蛇)生活的地方有N个水坑,编号为0,...,N - 1,有M条双向小路连接这些水坑.每两个水坑之间至多有一条路径(路径包含一条或多条小路)相互连接,有些水坑之间根本无法互通(即M ≤ N-1 ).Serpent走过每条小路需要一个固定的天数,不同的小路需要的天数可能不同.

splay专题复习——bzoj 3224 &amp; 1862 &amp; 1503 题解

[前言]快要省选二试了.上次去被虐出翔了~~这次即便是打酱油,也要打出风采!于是暂停新东西的学习,然后开始复习以前的知识,为骗分做准备.PS:区间翻转的暂时跳过,就算学了也来不及巩固了. [BZOJ3224] 3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1477  Solved: 570 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入

bzoj 3333: 排队计划 题解

[原题] 3333: 排队计划 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 161  Solved: 71 [Submit][Status] Description Input Output Sample Input 6 2 160 163 164 161 167 160 2 3 Sample Output 6 3 1 HINT Source wyx528命题 [分析]简述一下题目.N个数排成一列,每次指定一个位置P,然后把P~N中所有身高小