「NOI2013」树的计数

这什么神题


考虑对bfs重新编号为1,2,3...n,然后重新搞一下dfs序

设dfs序为\(dfn_i\),dfs序第\(i\)位对应的节点为\(pos_i\)

一个暴力是枚举bfs的分层,然后检查合法性。

但是我们注意到一个事情,节点\(i\)与节点\(i-1\)是否在同一层,是不是具有独立性呢?

设\(s_i\)表示\(i\)与\(i+1\)是否在同一层,当\(s_i=1\)时,表示不在同一层。

那么

  • \(s_1=1\),显然

  • 若区间\([l,r]\)是同层的,有\(dfn_L<dfn_{L+1}<\cdots<dfn_R\)

    这个注意一点,遍历边的顺序是一样的,因此bfs先访问的dfs一定也先

    这样可以得到

    若\(dfn_i>dfn_{i+1}\),则\(s_i=1\)

    注意只有这两个条件可以强制为\(s=1\),这个已经是全部了

    但是我们还需要统计\(s=0\)强制同一层的情况

  • 一个点dfs序后面的一个点,一定是它儿子或者它祖先的儿子,即

    \(dep_{pos_{i+1}}\le dep_{pos_i}+1\)

    设\(pos_i=a,pos_{i+1}=b\)

    如果\(a>b\),那么就是普通的另外开了一颗子树,属于无用条件

    如果\(b=a+1\),在条件2已经判断了

    如果\(b>a+1\),说明一定产生了一个\(1\)的断层

    也就是\(\sum_{j=a}^{b-1}s_i=1\)

  • 注意到可能有点\(s_i\)还是没有处理,说明这个无所谓,产生的答案为\(0.5\),因此答案为\(1+\sum s_i\)

处理的话前两个都好弄,第三个表示区间至少有一个\(1\)(区间的\(1\)已经被2统计了)

可以直接打差分tag,来区分一下位置上是0还是0.5


Code:

#include <cstdio>
#include <cctype>
template <class T>
void read(T &x)
{
x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
const int N=2e5+10;
int n,d[N],b[N],dfn[N],pos[N],s[N];
int main()
{
read(n);
for(int x,i=1;i<=n;i++) read(x),d[x]=i;
for(int i=1;i<=n;i++) read(b[i]);
for(int i=1;i<=n;i++) dfn[i]=d[b[i]];
for(int i=1;i<=n;i++) pos[dfn[i]]=i;
++s[1],--s[2];double ans=1;
for(int i=2;i<=n;i++)
if(dfn[i-1]>dfn[i])
++s[i-1],--s[i],++ans;
for(int i=2;i<=n;i++)
if(pos[i-1]+1<pos[i])
++s[pos[i-1]],--s[pos[i]];
for(int i=1,j=0;i<n;i++) j+=s[i],ans+=(!j)?0.5:0;
printf("%.3f\n",ans+1);
return 0;
}

2019.4.13

「NOI2013」树的计数 解题报告的更多相关文章

  1. loj#2665. 「NOI2013」树的计数

    目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...

  2. 【LOJ】 #2665. 「NOI2013」树的计数

    题解 我们统计深度对于bfs序统计,树结构出现分歧的地方必然是BFS序的最后一段,这个最后一段同时还得是dfs序上连续的一段 如果不是bfs序的最后一段,那么必然下一层会有节点,如果树结构分歧了,那么 ...

  3. 「FJOI2018」领导集团问题 解题报告

    「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显 ...

  4. 洛谷 P4714 「数学」约数个数和 解题报告

    P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...

  5. 「NOI2016」优秀的拆分 解题报告

    「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...

  6. 「NOI2016」循环之美 解题报告

    「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...

  7. 「CF242E」XOR on Segment 解题报告

    题面 长度为\(n\)的数列,现有两种操作: 1.区间异或操作 2.区间求和操作 对于每个查询,输出答案 思路: 线段树+二进制拆位 线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方 ...

  8. 「SP25784」BUBBLESORT - Bubble Sort 解题报告

    SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...

  9. 「SP122」STEVE - Voracious Steve 解题报告

    SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...

随机推荐

  1. IO流简要总结

    IO流小总结 IO流的本质就是用于数据的传输,根据流的方向的不同,有输入流.输出流.根据数据类型的不同,又有字节流.字符流. 字节流 字节输入流   InputStream 字节输出流   Outpu ...

  2. Umi+Dva搭建Cesium 3D开发环境

    umi,中文可发音为乌米,是一个可插拔的企业级 react 应用框架,是蚂蚁金服的底层前端框架,已直接或间接地服务了 600+ 应用,包括 java.node.H5 无线.离线(Hybrid)应用.纯 ...

  3. C#中try catch finally 用法

    1.将预见可能引发异常的代码包含在try语句块中. 2.如果发生了异常,则转入catch的执行. catch有几种写法: catch  这将捕获任何发生的异常. catch(Exception e)  ...

  4. Python数据描述与分析

    在进行数据分析之前,我们需要做的事情是对数据有初步的了解,比如对数据本身的敏感程度,通俗来说就是对数据的分布有大概的理解,此时我们需要工具进行数据的描述,观测数据的形状等:而后才是对数据进行建模分析, ...

  5. typescript的函数

    1:默认参数(传入值会覆盖默认参数,不传值也行) function getinfo(name:string,age:number=20):string{ return `${name}---${age ...

  6. vscode指定扩展安装位置

    默认情况下,(Windows)vscode的安装路径为C:\Users\用户名\.vscode\extensions. 如果想要自定义扩展的安装路径,无法直接在vscode中修改.但是,在启动vsco ...

  7. spark als scala实现(二)

    Vi  t1.txt1,101,5.01,102,3.01,103,2.52,101,2.02,102,2.52,103,5.02,104,2.03,101,2.53,104,4.03,105,4.5 ...

  8. mongodb复制+分片集原理

    ----------------------------------------复制集---------------------------------------- 一.复制集概述: Mongodb ...

  9. SSIS中xml的输入输出

    输出为XML的两种方法 1.用数据流, 将平面文件作为DES输出 在SQL里将要输出的数据查询成为单列的字符串: SELECT (SELECT * FROM A FOR XML ROOT('A'),E ...

  10. linux 系统shell运行程序不退出

    如果通过ssh远程连接到linux系统终端,在shell下执行程序.假如程序名称为app,且程序本身会一直执行不退出,程序执行需要参数文件paramfile. 当我们用 ./app paramfile ...