「NOI2013」树的计数 解题报告
「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」树的计数 解题报告的更多相关文章
- loj#2665. 「NOI2013」树的计数
目录 题目链接 题解 代码 题目链接 loj#2665. 「NOI2013」树的计数 题解 求树高的期望 对bfs序分层 考虑同时符合dfs和bfs序的树满足什么条件 第一个点要强制分层 对于bfs序 ...
- 【LOJ】 #2665. 「NOI2013」树的计数
题解 我们统计深度对于bfs序统计,树结构出现分歧的地方必然是BFS序的最后一段,这个最后一段同时还得是dfs序上连续的一段 如果不是bfs序的最后一段,那么必然下一层会有节点,如果树结构分歧了,那么 ...
- 「FJOI2018」领导集团问题 解题报告
「FJOI2018」领导集团问题 题意:给你一颗\(n\)个点的带点权有根树,选择一个点集\(S\),使得点集中所有祖先的点权$\le \(子孙的点权,最大化\)|S|$(出题人语死早...) 一个显 ...
- 洛谷 P4714 「数学」约数个数和 解题报告
P4714 「数学」约数个数和 题意(假):每个数向自己的约数连边,给出\(n,k(\le 10^{18})\),询问\(n\)的约数形成的图中以\(n\)为起点长为\(k\)的链有多少条(注意每个点 ...
- 「NOI2016」优秀的拆分 解题报告
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...
- 「NOI2016」循环之美 解题报告
「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...
- 「CF242E」XOR on Segment 解题报告
题面 长度为\(n\)的数列,现有两种操作: 1.区间异或操作 2.区间求和操作 对于每个查询,输出答案 思路: 线段树+二进制拆位 线段树区间修改一般使用的都是懒标记的方法,但是对于异或,懒标记的方 ...
- 「SP25784」BUBBLESORT - Bubble Sort 解题报告
SP25784 BUBBLESORT - Bubble Sort 题目描述 One of the simplest sorting algorithms, the Bubble Sort, can b ...
- 「SP122」STEVE - Voracious Steve 解题报告
SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...
随机推荐
- .net 简单实用Log4net(多个日志配置文件)
前言: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题.所以这个时候就 ...
- java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑
1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ...
- Biorhythms(poj1006+中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117973 Accepted: 37026 Des ...
- PHP数字金额转换大写金额
早些年做CRM用到的一个金额转换函数,今天从旧项目中拿出来记录一下.金额转换的函数方法有很多,都很不错.不过这个是小崔刚工作的时候写的一个转换函数,多少还是有点纪念意义.如有问题请朋友们指出,小崔及时 ...
- js调用百度地图接口绘制任意多边形并获取每个点的经纬度等
来自:https://blog.csdn.net/u013239236/article/details/52213977 侵删 <!DOCTYPE html> <html> & ...
- 在 Angular 8 中,我们可以期待些什么
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 --- Angular 作为一款优秀的前端框架,自诞生之日起,就致力于面向前端开发者 ...
- DataPipeline CTO陈肃:从ETL到ELT,AI时代数据集成的问题与解决方案
引言:2018年7月25日,DataPipeline CTO陈肃在第一期公开课上作了题为<从ETL到ELT,AI时代数据集成的问题与解决方案>的分享,本文根据陈肃分享内容整理而成. 大家好 ...
- Asp.Net中virtual、override理解
virtual关键字用于指定属性或方法在派生类中重写.默认情况下,派生类从其基类继承属性和方法,如果继承的属性或方法需要在派生类中有不同的行为,则可以重写它,即可以在派生类中定义该属性或方法的新实现, ...
- SQL高级查询基础
1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...
- w3wp.exe进程占用内存过高解决方法
解决CPU占用过多: 1.在IIS中对每个网站进行单独的应用程序池配置.即互相之间不影响. 2.设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭. 根据w3wp ...