CF1065F Up and Down the Tree
题解:
和正解方法不太一样
正解的大概意思就是先向下走可以走回来的 再走不能走回来的
能走回来的就是到这个儿子后最近的叶子可以返回的
然后这样可以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的更多相关文章
- [CF1065F]Up and Down the Tree[树dp]
题意 给定一棵以 \(1\) 为根的树,你每次可以选择跳到某个叶子节点,再跳到和他深度差不超过 \(k\) 的祖先.询问最多能够跳到多少个叶子节点. \(n,k\leq 10^6\) . 分析 最后的 ...
- [CF1065F]Up and Down the Tree_tarjan_树形dp
Up and Down the Tree 题目链接:https://www.luogu.org/problem/CF1065F 数据范围:略. 题解: 我们把每个叶子向它上面$k$个点连边,然后tra ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
随机推荐
- java的数组
作用:存储相同类型的一组数组,相当于一个容器,存放数据的.对同种数据类型集中存储.管理.便于遍历 数组类型:就是数组中存储的数据的类型 特点:数组中的所有元素必须属于相同的数据类型,数组中所有元素在内 ...
- 原生js实现平滑滚动
在以前的项目中有用到,在此整理一下: html部分 <span id="gotop">回到顶部</span> JS部分 // 使用requestAnimat ...
- 【深度学习】RNN | GRU | LSTM
目录: 1.RNN 2.GRU 3.LSTM 一.RNN 1.RNN结构图如下所示: 其中: $a^{(t)} = \boldsymbol{W}h^{t-1} + \boldsymbol{W}_{e} ...
- Hadoop大数据通用处理平台
1.简介 Hadoop是一款开源的大数据通用处理平台,其提供了分布式存储和分布式离线计算,适合大规模数据.流式数据(写一次,读多次),不适合低延时的访问.大量的小文件以及频繁修改的文件. *Hadoo ...
- java 代码
java 里的 pandas tablesaw DataFrame 再有就是 spark 了 java 代码规范 Java8特性详解 lambda表达式 Stream Sonar 规则检测 sprin ...
- 浅入深出Vue:环境搭建
浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...
- Django 框架初步了解
Django框架初探 1.web框架介绍 本质 socket 服务端 : 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.建立网络通信连接至少要一对端口号(s ...
- opencv基础教程 之 图像基础和绘图
1,教程:感谢小强 2,用argparse传参数来显示一张图片 #!/usr/bin/python #linux系统 #coding=utf-8 import cv2 import argparse ...
- 封装selenium自动化框架中的截图功能
对selenium自带的截图功能进行封装: 以下为封装的代码,自定义一个.py文件即可,图片路径自己设置一个. #coding:utf-8 class Screen(object): ''' 封装的截 ...
- docker中的镜像中运行Django项目
首先要在镜像中 安装python3 以及 django2.0.4 目前我用的是这两个版本. 进入镜像 创建项目 进入项目中修改setting文件 将引号和星号添加进括号中 ALLOWED_HOSTS ...