「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. oracle学习笔记(二) 基本数据类型

    常用的数据类型 int number number(4,1) 999.1 四个数字,小数位一位 decimal date 日期 格式如下: 注意:日期类型的字段格式,可以通过以下三种方式: 1. da ...

  2. Docker+SpringBoot远程发布

    Docker+SpringBoot远程发布 发布成功后启动: docker run -di --name demo1.1 -p 8080:8085 demo:1.0 docker run 命令大全:h ...

  3. JVM虚拟机基本概念

    一.JVM运行时数据区域1.1.程序计数器 一块较小的内存空间,当前线程所执行的字节码指示器.每个线程有一个独立的程序计数器1.2.Java虚拟机栈 线程私有,生命周期与线程相同 每个方法在执行时会创 ...

  4. APP网站安全漏洞检测服务的详细介绍

    01)概述: 关于APP漏洞检测,分为两个层面的安全检测,包括手机应用层,以及APP代码层,与网站的漏洞检测基本上差不多,目前越来越多的手机应用都存在着漏洞,关于如何对APP进行漏洞检测,我们详细的介 ...

  5. mysql很有用的语句

    1)删除表内所有数据: 再添加数据时,如果设有自动增加的id,那么id也会重置. truncate table 表名; 2)创建结构相同的数据库表 create table 数据库名.新表名 like ...

  6. java或Jmeter实现两个日期相加减(2003-06-01-2003-05-01)

    在beanshell中写入如下代码, import java.io.FileInputStream; SimpleDateFormat myFormatter = new SimpleDateForm ...

  7. 前端 聊聊Ajax

    转载:关于Ajax的全面总结.

  8. 【RL-TCPnet网络教程】第1章 当前主流的小型嵌入式网络协议栈

    第1章   当前主流的小型嵌入式网络协议栈 这几年物联网发展迅猛,各种新产品.新技术也是层出不穷,本章节就为大家介绍当前主流的小型嵌入式网络协议栈. 1.1  当前主流的嵌入式网络协议栈 1.2  u ...

  9. 初步了解PE分析

    尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...

  10. 浅论Python密文输入密码的方法

    近来做作业(老男孩那个9.9元的训练营)我想写一个装逼点的密文输入密码,类似于: 这个东西我先前实现过,忘了获取一个字节的方法是什么,于是去网上找,发现网上的实现方式大部分都有问题. 一.网上(百度) ...