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 ...
随机推荐
- python学习day15 模块(重点)
模块(重点) python2,与py3的区别 py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不会再内存 ...
- Arrays和String单元测试(课下作业,选做)
在IDEA中以TDD的方式对String类和Arrays类进行学习- 测试相关方法的正常,错误和边界情况 - String类 - charAt - split - Arrays类 - sort - b ...
- JavaWeb之DButils整理
一.DBUtils介绍 apache 什么是dbutils,它的作用 DBUtils是java编程中的数据库操作实用工具,小巧简单实用. 用前导包!!!DBUtils包!!! 二.DBUtils的三 ...
- 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...
- 【JS】前端文件下载(无刷新)方法总结
#传统方法 利用iframe 或 form.submit 或 windows.open直接向后端发请求,后端返回文件流,后端处理成功后会直接返回到页面,浏览器会整理并打开自己的保存下载文件机制 . 1 ...
- python之路(12)网络编程
前言 基于网络通信(AF_INET)的socket(套接字)实现了TCP/UDP协议 目录 基于TCP协议的socket 基于UDP协议的socket TCP协议下粘包现象及处理 使用socketse ...
- GIL全局锁测试
基础知识:https://www.cnblogs.com/SuKiWX/p/8804974.html 测试环境 python3.7默认解释器(cpython) cpu为四核 测试代码 #! /usr/ ...
- Oracle DB Day01(SQL)
--时间为什么不是现在呢? --设置时区和显示时间 ALTER DATABASE SET TIME_ZONE='+08:00' select to_char(current_timestamp at ...
- echo 输入背景和字体常用方法
ECHO输出背景颜色以及文字颜色输出格式: echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"例如: echo -e & ...
- Arduino-常用指令
pinMode(LEDPin,OUTPUT); //设置引脚模式 参数1 引脚 参数2 OUTPUT 输出:INPUT 输入 用在setup()函数里 digi ...