uoj122 NOI2013—树的计数

Posted MashiroSky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uoj122 NOI2013—树的计数相关的知识,希望对你有一定的参考价值。

http://uoj.ac/problem/122 (题目链接)

题意

  给出一棵树的dfs序和bfs序,保证一定可以构成一棵树。问构成的树的期望深度。

Solution

  这是一个悲伤的故事,我YY的东西挂了,最后打满了补丁,化简一下,就是跟llg一样的写法。←_←别理他。

  本来很简单的一个东西,也许是我脑洞太大了→_→

代码

// uoj122
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define MOD 1000000007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=200010;
int vis[maxn],dfn[maxn],bfn[maxn],t[maxn],pos[maxn],n;
double ans;

int main() {
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&dfn[i]);
	for (int i=1;i<=n;i++) scanf("%d",&bfn[i]),t[bfn[i]]=i;
	for (int i=1;i<=n;i++) dfn[i]=t[dfn[i]];
	for (int i=1;i<=n;i++) pos[dfn[i]]=i;
	ans=2;
	int l=2,r=n+1;
	vis[1]=1,vis[2]=1;
	for (int i=3;i<=n;i++) {
		if (pos[i-1]>pos[i]) ans++;
		if (pos[i-1]+1==pos[i] && r-l-1==n-i+1) ans+=0.5;
		vis[pos[i]]=1;
		while (vis[l+1]) l++;
		while (vis[r-1]) r--;
	}
	printf("%.3lf",ans);
	return 0;
}

 

以上是关于uoj122 NOI2013—树的计数的主要内容,如果未能解决你的问题,请参考以下文章

UOJ #122 NOI2013 树的计数

BZOJ3244UOJ#122NOI2013]树的计数

BZOJ3244 [Noi2013]树的计数/UOJ122

[NOI2013]树的计数

[bzoj3244] [洛谷P1232] [Noi2013] 树的计数

BZOJ3244: [Noi2013]树的计数