P1232 [NOI2013] 树的计数

题目大意

给你一个 dfs 序和一个 bfs 序,求所有满足这两个序的树的高的平均值( 保留三位小数 ),输入保证至少存在一棵树符合给定的两个序列。

解题思路

首先可以从 bfs 序入手,因为更具 bfs 序的性质,可以发现 bfs 序可以分成 xx 个段,每一段中的节点都是在同一行中,而这棵树 ii 的树高 hih_i 又恰好与 xx 相等。

这里为了方便 ,

did_i 为点 ii 在 dfs 序的位置。

bib_i 为点 ii 在 bfs 序的位置。

那就可以设有一任意点 kk,则 kk33 种情况:

  1. 只能分段,ans+1ans+1
  2. 分不分都行,ans+0.5ans+0.5
  3. 不能分,ansans 不变。

对于情况 22 和情况 33,我们可以用一个差分数组 cc,记录点 ii 是情况 22 还是情况 33

  • cic_i 不为 00,则说明这个地方不设断点或设了断点,若不设断点,则贡献为 00;若设了断点,贡献为 11,但 cic_i 依旧为 00,因为断点的个数记录在 ansans 里就行了 。
  • cic_i00,说明这个地方可以分层也可以不分层,则对平均树高(也就是答案)的贡献为 0.50.5,因为如果分层,则贡献为 11;如果不分层,则贡献为 00,综合起来贡献就为 (1+0)2=0.5\frac{(1+0)}{2}=0.5

再思考情况 11 ,如果有一个断点,说明满足条件的所有树都应该在这里分层,则对平均树高(也就是答案)的贡献为 11

对于情况 11,我们可以从 bfs 序连续的两点和 dfs 序连续的两点这两个方向入手。

此时显然可以得到一个约束条件,对于 bfs 序连续的两点 x=bfni,y=bfni+1x=bfn_i,y=bfn_{i+1}

  • 如果 d[x]>d[y]d[x]>d[y],说明 yyxx 的下一层,属于情况 11
  • 如果 d[x]<d[y]d[x]<d[y],说明 yyxx 的下一层 或  x\ xyy 在同一层,属于情况 22

再思考 dfs 序连续的两点 x=dfni,y=dfni+1x=dfn_i,y=dfn_{i+1},有 33 种情况:

  1. bx+1=byb_x+1=b_yxxyy 是兄弟( xx 没有儿子 );
  2. bx>byb_x>b_yyyxx 的某个祖先的某个儿子( xx 没有儿子);
  3. yyxx 的儿子,属于情况 11

分析情况 33 ,发现编号从 xxy1y-1 的所有节点深度差不超过 11,而情况 33 的贡献在上面已经计算过了,所以情况 33 在这里的贡献为 00,要在差分数组里面记录一下。另外,记录时要把情况 11 和情况 22 筛掉,当然也可以不筛,单独判断 b[x]+1<b[y]b[x]+1<b[y] 就行了。

AC CODE

#include <bits/stdc++.h>
#define int long long
#define _ (int)2e5 + 5
using namespace std;

int n;
int cc;
int x, y;
double ans = 2.0;
array<int, _> bfn, dfn, b, d, c;

signed main()
{
	scanf("%lld", &n);
	c[1]++, c[2]--;
	for (int i = 1; i <= n; ++i)
	{
		scanf("%lld", &dfn[i]);
		d[dfn[i]] = i;
	}
	for (int i = 1; i <= n; ++i)
	{
		scanf("%lld", &bfn[i]);
		b[bfn[i]] = i;
	}
	for (int i = 1; i < n; ++i)
	{
		x = bfn[i], y = bfn[i + 1];
		if (d[x] > d[y])
		{
			c[i]++, c[i + 1]--;
			ans++;
		}
		x = dfn[i], y = dfn[i + 1];
		if ((!(b[x] > b[y])) && (!(b[x] + 1 == b[y]))) //b[x] + 1 < b[y]
		{
			c[b[x]]++, c[b[y]]--;
		}
	}
	for (int i = 1; i < n; ++i)
	{
		cc += c[i];
		if (!cc)
		{
			ans += 0.5;
		}
	}
	printf("%.3lf\n", ans);
	return 0;
}
posted @ 2021-07-26 11:19  蒟蒻orz  阅读(3)  评论(0编辑  收藏  举报  来源