题目链接

BZOJ3244

题解

不会做orz

我们要挖掘出\(bfs\)序和\(dfs\)序的性质

①容易知道\(bfs\)序一定是一层一层的,如果我们能确定在\(bfs\)序中各层的断点,就能确定深度

②由于\(bfs\)序和\(dfs\)序儿子遍历顺序是一样的,所以\(bfs\)序同一层的点,在\(dfs\)序中顺序也一样,如果存在\(u,v\)在\(bfs\)中相邻,而在\(dfs\)序中逆序,那么\(u,v\)之间一定有断点

③\(dfs\)序中相邻的两个点\(u,v\)之间\(v\)要么为\(u\)的儿子,要么为\(u\)某个祖先的儿子,若\(v\)的\(bfs\)序大于\(u\)的,那么它们之间之多存在一个断点

④在③中确定的限制区间内,如果包含②中确定的断点,那么就可以确定其余点一定不分层。否则区间内点的顺序一定与\(dfs\)序一样,由于区间端点\(dfs\)序中相邻,所以这个区间只可能限制了一个断点

综上:

①若\(bfs\)序中相邻的在\(dfs\)序中逆序,必有断点

②\(dfs\)序中相邻的在\(bfs\)序中正序,之间最多一个断点,要么已确定期望\(1\)个,要么就只有一个不确定,期望\(0.5\)个

③\(1\)只有必有断点

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
using namespace std;
const int maxn = 200005,maxm = 100005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int dfs[maxn],bfs[maxn],pos[maxn],id[maxn],x[maxn],sum[maxn],D[maxn],n;
int main(){
n = read();
REP(i,n) dfs[i] = read();
REP(i,n) bfs[i] = read(),id[bfs[i]] = i;
REP(i,n) dfs[i] = id[dfs[i]],pos[dfs[i]] = i;
x[1] = 1;
for (int i = 2; i < n; i++)
if (pos[i] > pos[i + 1]) x[i] = 1;
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + x[i];
for (int i = 1; i < n; i++)
if (dfs[i] < dfs[i + 1]){
if (sum[dfs[i + 1] - 1] - sum[dfs[i] - 1]){
D[dfs[i]]++;
D[dfs[i + 1]]--;
}
}
int tot = 0;
for (int i = 1; i < n; i++){
tot += D[i];
if (!x[i] && tot) x[i] = 2;
}
double ans = 1.0;
for (int i = 1; i < n; i++){
if (x[i] == 1) ans += 1.0;
else if (!x[i]) ans += 0.5;
}
printf("%.3lf\n%.3lf\n%.3lf\n",ans - 0.001,ans,ans + 0.001);
return 0;
}

最新文章

  1. php 封装
  2. POJ2677 Tour[DP 状态规定]
  3. [LeetCode] Subsets (bfs的vector实现)
  4. NC保存报dirty解决方法
  5. cocos2d - CCParallaxNode 例子
  6. JavaScript入门(6)
  7. c#获取远程图片的方法
  8. mac 下 配置 阿帕奇
  9. Ext4 MVC CRUD操作
  10. hibernate和mybatis区别
  11. js常用的正则表达式
  12. L3-007 天梯地图 (30 分) dijkstra
  13. shell的编程结构体(函数、条件结构、循环结构)
  14. Ubuntu菜鸟入门(十七)—— E: Sub-process /usr/bin/dpkg returned an error code (1) 出错解决方案
  15. [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
  16. (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析
  17. The P4 Language Specification v1.0.2 Introduction部分
  18. 使用COM口的2、3针的通断作为中端源(有一个读图像的摄像头,当把卡插到位时触发中端,防止在插卡的过程中出现不稳定的图像)
  19. consul ACL2
  20. JZYZOJ1383 [usaco2003feb]impster 位运算 最短路

热门文章

  1. 文件权限管理命令chmod,chown与文本搜索命令grep
  2. 汇编:输出寄存器AX中的内容(子程序)
  3. IOS中input与fixed同时存在的情况会出现bug
  4. 笔记-爬虫-去重/bloomfilter
  5. TouTiao开源项目 分析笔记5
  6. AD9 设置网络标号作用域
  7. Android启动屏全屏显示
  8. label标签的作用
  9. CC3200模块的内存地址划分和bootloader,启动流程(二)
  10. ios tcpdump