题解:

和正解方法不太一样

正解的大概意思就是先向下走可以走回来的 再走不能走回来的

能走回来的就是到这个儿子后最近的叶子可以返回的

然后这样可以O(n)计算

我自己做的时候以为这样不太能做。。

所以用的是哪些点可以返回当前点

途中可以利用其它叶子

可以发现如果可以利用其他叶子到达,那多个的时候也可以到达

于是我们只需要统计一条链上能到达的最大值

这个可以线段树维护一下

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (int i=h;i<=t;i++)
#define dep(i,t,h) for (int i=t;i>=h;i--)
#define mid ((h+t)>>1)
const int N=1.1e6;
const int INF=1e9;
int head[N],l,n,k;
int bz[][N],dfn[N],num[N],dy[N],cnt,p[N],ans[N];
bool t[N];
struct re{
int a,b;
}e[N*];
IL void arr(int x,int y)
{
e[++l].a=head[x];
e[l].b=y;
head[x]=l;
}
void dfs(int x,int y)
{
bz[][x]=y; dfn[x]=++cnt; num[x]=; dy[cnt]=x;
for (rint u=head[x];u;u=e[u].a)
{
int v=e[u].b;
if (v!=y)
{
dfs(v,x);
num[x]+=num[v];
}
}
}
IL int js(int x)
{
int k1=k;
dep(i,,)
if (k1>(<<i))
{
x=bz[i][x]; k1-=(<<i);
}
x=bz[][x];
if (x) return x; else return ;
}
struct sgt{
int v[N*];
sgt() { rep(i,,N*-) v[i]=INF;}
void change(int x,int h,int t,int pos,int k)
{
v[x]=min(v[x],k);
if (h==t) return;
if (pos<=mid) change(x*,h,mid,pos,k);
else change(x*+,mid+,t,pos,k);
}
int query(int x,int h,int t,int h1,int t1)
{
if (h1<=h&&t<=t1)
{
return v[x];
}
int ans=INF;
if (h1<=mid) ans=query(x*,h,mid,h1,t1);
if (mid<t1) ans=min(ans,query(x*+,mid+,t,h1,t1));
return ans;
}
}S;
queue<int> q;
void bfs()
{
q.push(); S.change(,,n,,);
while (!q.empty())
{
int x=q.front(); q.pop();
if (!t[x])
{
int tmp=S.query(,,n,dfn[p[x]],dfn[p[x]]+num[p[x]]-);
tmp=min(tmp,dfn[p[x]]);
ans[dy[tmp]]++;
S.change(,,n,dfn[x],tmp);
}
for (rint u=head[x];u;u=e[u].a)
{
int v=e[u].b;
if (v!=bz[][x]) q.push(v);
}
}
}
void dfs2(int x,int y)
{
ans[x]+=ans[y];
for (rint u=head[x];u;u=e[u].a)
{
int v=e[u].b;
if (v!=y) dfs2(v,x);
}
}
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>k;
rep(i,,n)
{
int x;
cin>>x; t[x]=;
arr(x,i);
}
dfs(,);
rep(i,,)
rep(j,,n)
bz[i][j]=bz[i-][bz[i-][j]];
rep(i,,n) p[i]=js(i);
bfs();
dfs2(,);
int ansa=;
rep(i,,n) if (ans[i]>ansa) ansa=ans[i];
cout<<ansa<<endl;
return ;
}

CF1065F Up and Down the Tree的更多相关文章

  1. [CF1065F]Up and Down the Tree[树dp]

    题意 给定一棵以 \(1\) 为根的树,你每次可以选择跳到某个叶子节点,再跳到和他深度差不超过 \(k\) 的祖先.询问最多能够跳到多少个叶子节点. \(n,k\leq 10^6\) . 分析 最后的 ...

  2. [CF1065F]Up and Down the Tree_tarjan_树形dp

    Up and Down the Tree 题目链接:https://www.luogu.org/problem/CF1065F 数据范围:略. 题解: 我们把每个叶子向它上面$k$个点连边,然后tra ...

  3. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  4. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  5. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  6. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  7. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  8. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  9. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

随机推荐

  1. Codeforces Round #544 (Div. 3) D F1 F2

    题目链接:D. Zero Quantity Maximization #include <bits/stdc++.h> using namespace std; #define maxn ...

  2. 没想到: System.out.println(n1 == f1 ? n1 : f1);

    int n1 = 404; float f1 = 404.0f; if(n1 == f1) { System.out.println("两者相等"); } System.out.p ...

  3. Digao 连接Mysql 连接不上解决办法

    错误一:No module named 'MySQLdb' 原因:python3连接MySQL不能再使用mysqldb,取而代之的是pymysql. 解决方法:在python的MySQL包中,即路径: ...

  4. 请求转发 和 URL 重定向

    五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 ...

  5. Java 集合系列之一:JCF集合框架概述

    容器,就是可以容纳其他Java对象的对象.Java Collections Framework(JCF)为Java开发者提供了通用的容器 java集合主要划分为四个部分: Collection(Lis ...

  6. centos7通过nginx搭建SSL

    今天给大家带来的是一篇关于通过nginx搭建HTTPS访问转跳后端HTTP的教程,部署方式如下: 安装基础组件yum -y isntall firewalldyum -y install gcc gc ...

  7. 阿里云OSS的Bucket容量大小采集

    #!/usr/bin/env python3 #-*- coding: utf-8 -*- # 获取阿里云云监控中 OSS 中的bucket 的bucket大小 from aliyunsdkcore. ...

  8. JGUI源码:prefixfree 这个库有时候会引起网页一直加载中(10)

    如题,大部分情况下正常,但是chrome频繁刷新时,会出现这个问题,控制台没有异常信息.最终放弃使用引用第三方库prefixfree.min.js

  9. 使用hql动态创建对象问题

    前段时间由于需求要添加报表数据,调整ireport后,打印pdf文件出现数据错位的情况,调试发现不是ireport问题,就查看了后台传送的数据,最后发现传送的对象属性值已经就是错位的,那就是获取对象时 ...

  10. istio环境搭建for macbook

    首先需要搭建docker+k8s环境,如何搭建这里就不再赘述,可以自行搜索. 打开命令行,运行命令: curl -L https://git.io/getLatestIstio | ISTIO_VER ...