2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组

武当派一共有 nnn 人,门派内 nnn 人按照武功高低进行排名,武功最高的人排名第 111,次高的人排名第 222,... 武功最低的人排名第 nnn。现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师父,每个人可能有多个徒弟。

我们知道,武当派人才辈出,连祖师爷的武功都只能排行到 ppp。也就是说徒弟的武功是可能超过师父的,所谓的青出于蓝胜于蓝。

请你帮忙计算每个人的所有子弟(包括徒弟的徒弟,徒弟的徒弟的徒弟....)中,有多少人的武功超过了他自己。

输入格式

输入第一行两个整数 n,p(1≤n≤100000,1≤p≤n)n, p(1 \le n \le 100000, 1 \le p \le n)n,p(1n100000,1pn)

接下来 n−1n-1n1 行,每行输入两个整数 u,v(1≤u,v≤n)u, v(1 \le u, v \le n)u,v(1u,vn),表示 uuuvvv 之间存在师徒关系。

输出格式

输出一行 nnn 个整数,第 iii 个整数表示武功排行为 iii 的人的子弟有多少人超过了他。

行末不要输出多余的空格

样例输入

10 5
5 3
5 8
3 4
3 1
2 1
6 7
8 7
9 8
8 10

样例输出

0 0 2 0 4 0 1 2 0 0

题意就是给我们一颗树 让我们求 每个点的所以所有孩子节点有多少比自己小的节点的数量

可以dfs下把所有节点的父节点找到 然后每个点不断地向上找父节点 一直找到根 这样的复杂度接近n的平方级 肯定超时
为了不超时
我们可以把整颗树的DFS序搞出来 然后任意一个节点的先序和后序顺序 中间的差就是这个点的孩子节点的个数
但是我们要找的是孩子节点中比他小的节点
那么我们就可以dfs序和树状数组配合起来 dfs序把树形问题转化成了区间上的问题
我们知道这个点的先序和后序位次 那么如果有比他小的节点在这个节点的先序和后序之间遍历到了
那么一定是符合要求的点
所以我们可以从小大到处理点 对于每个点查询先序后序位置中树状数组存储的差
然后再把当前节点的先序插入进去  这样的好处就是先遍历标号小的节点 先把小的节点的先序插到树状数组
树状数组维护的就是当前节点先序插入时的次序 因为我们是通过前序后序间符合条件的点数来求解的


import java.util.ArrayList;
import java.util.Scanner;
import java.util.Vector;public class Main {final static int maxn = 100010; public static int [] tre = new int[maxn];public static ArrayList<Integer>[] gra = new ArrayList[maxn];//存图public static boolean[] bok = new boolean[maxn];public static boolean[] vis = new boolean[maxn];public static int[] l = new int[maxn];//记录先序public static int[] r = new int[maxn];//记录第二次回溯回来时的顺序public static int time =0 ;static void DFS(int now) {l[now] = ++time;for(int i=0;i<gra[now].size();i++) {int t = gra[now].get(i);if(!vis[t]) {vis[t]=true;DFS(t);vis[t]=false;}}r[now] = time;}static void add(int x) {while(x<maxn) {tre[x]+=1;x+=x&(-x);}}static int sum(int x) {int S=0;while(x!=0) {S+=tre[x];x-=x&(-x);}return S;}public static void main(String[] args) {int n,p;Scanner sc = new Scanner(System.in);n = sc.nextInt();p = sc.nextInt();for(int i=1;i<n;i++) {int s,e;s = sc.nextInt();e = sc.nextInt();if(bok[s]==false) {bok[s] = true;gra[s] = new ArrayList<Integer>();gra[s].add(e);}else gra[s].add(e);if(bok[e]==false) {bok[e] = true;gra[e] = new ArrayList<Integer>();gra[e].add(s);}else gra[e].add(s);}vis[p]=true;DFS(p);for(int i=1;i<=n;i++) {System.out.print(sum(r[i])-sum(l[i]));add(l[i]);if(i==n)System.out.println();else System.out.print(" ");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

【问题描述】[中等] 【解答思路】 1. DFS 深度优先遍历 时间复杂度&#xff1a;O(NM) 空间复杂度&#xff1a;O(N) class Solution {private static final int UNCOLORED 0;private static final int RED 1;private static final int GREEN 2;private int[] color;privat…

[剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

【问题描述】[中等] 235/68-1 搜索二叉树 236/68-2 二叉树 【解答思路】 递归 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下。 class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, Tr…

Docker 查看镜像信息

Docker 查看镜像信息 原文:Docker 查看镜像信息文章首发个人网站&#xff1a; https://www.exception.site/docker/docker-look-up-image-info 本文中&#xff0c;我们将需要学习 Docker 如何查看镜像信息&#xff1f; 一、images 命令列出镜像 通过使用如下两个命令&#xff0…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第7篇]随机性如何辅助计算和什么是BPP类问题

这篇是密码学52件事中第7篇.我们只要把问题集中在BPP复杂类问题. 目前为止,我们已经介绍了一些复杂类: P 是一类能在多项式时间内被可确定的图灵机判定的问题.NP是一类能在多项式时间内被非确定的图灵机判定的问题.BPP是一类在多项式时间内被概率图灵机解出的问题,并且对所有…

73 forward动作

定义一个logind的jsp页面 <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert tit…

Linux系统开发之路 - 下

5、Ubuntu安装好之后&#xff0c;就可以进行开发环境的搭建。&#xff08;坚持看完有彩蛋&#xff0c;(>--..--<).jpg&#xff09;。 1&#xff09;首先安装Nodejs和Npm。 打开浏览器输入nodejs.org&#xff0c;进入页面会提示下载&#xff0c;如下图&#xff0c;选择LTS…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第8篇]交互式的定义如何帮助计算和IP类问题是什么

这是系列中的第8篇&#xff0c;我们主要讨论计算中交互作用的用处和IP类问题是什么. 什么是证明 经典的证明 交互式证明系统 [1] http://dl.acm.org/citation.cfm?id63434 [2] http://www.amazon.co.uk/Introduction-Theory-Computation-Michael-Sipser/dp/0619217642 [3] h…

线段树之扫描线思路

运用线段树扫描线方式可以解决经典的求矩形面积交问题以HDU_1542 Atlantis 题为例 线段树和扫描线是这么结合的线段树统计的是有效区间段的长度 也就是扫描线 当前扫描到的区间段是哪一个 什么意思 比如当前在哪一个段扫描 那么线段树中的t[1]中的len就是多长 线段树一般…

74 param动作

定义一个logind的jsp <% page language"java" import"java.util.*" contentType"text/html; charsetutf-8"%><!DOCTYPE html> <html> <head> <meta charset"ISO-8859-1"> <title>Insert title h…

Unknown column 'user_uid' in 'field list' sql错误解决过程

在idea中运行一直有错&#xff0c;找了好多个地方都找不到&#xff0c;以为是我的字段名字写错了&#xff0c;然而都是对的。 把错误的这个字段删了再打一遍就好了&#xff0c; 转载于:https://www.cnblogs.com/zxrxzw/p/10630164.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第9篇]香农对熵和信息的定义是什么?

这是计算机理论的最后一篇.我们讨论信息理论的基础概念,什么是香农定义的熵和信息. 熵 熵与确定性成反比 信息 密码学实例 [1] Thomas M. Cover and Joy A. Thomas. Elements of Information Theory ​ 2nd Edition. Wiley-Interscience, 2 edition, July 2006. [2] S. Vaj…

数据结构:(5)算法分析基础

算法时间复杂度分析 算法空间复杂度分析

蠢货别忘(一)common lisp funcall

自定义 cons&#xff0c;car&#xff0c;cdr Scheme 示例&#xff1a; (define (my_cons x y) (lambda (z) (z x y))) (define (my_car m) (m (lambda (p q) p))) (define (my_cdr m) (m (lambda (p q) p))) Common Lisp&#xff1a; (defun my_cons (x y) (lambda (z) (funcal…

[Leetcode][第35题][JAVA][搜索插入位置][二分法]

【问题描述】[中等] 【解答思路】 二分法 时间复杂度&#xff1a;O(LogN) 空间复杂度&#xff1a;O(1) public class Solution {public int searchInsert(int[] nums, int target) {int len nums.length;if (len 0) {return 0;}// 特判if (nums[len - 1] < target) {re…

数据结构:(6)其他情况的算法分析

最好&#xff0c;最坏,平均复杂度分析 递归算法的时间复杂度分析

树状数组的区间修改+查询

首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] Sigma a[i] Sum(bit[x]&#xff09; 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 这样的话也就是最del[i]求前缀和 就能得到i~n的所有修改了 因为i前的每一个元素的修改都是对后面…

scrapy爬虫系列之五--CrawlSpider的使用

功能点&#xff1a;CrawlSpider的基本使用 爬取网站&#xff1a;保监会 主要代码&#xff1a; cf.py # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule import reclass CfSpider(CrawlSp…

洛谷P4718 【模板】Pollard-Rho算法

虽然很久以前就听说过PR算法&#xff0c;但前几天第一次打。 首先miller rabin判断素数&#xff0c;不在复杂度瓶颈。 pollard rho倍增环长&#xff0c;复杂度是\(O(n^{\frac{1}{4}} log n)\)的。 然而这样复杂度较高&#xff0c;比较难过加强后的数据。 可以考虑每次倍增时把乘…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第10篇]RSA和强RSA问题有什么区别

这个密码学52件事数学知识的第一篇,也是整个系列的第10篇.这篇介绍了RSA问题和Strong-RSA问题,指出了这两种问题的不同之处. 密码学严重依赖于这样的假设,某些数学问题难以在有限的时间内解决.让我们看公钥(非对称)密码学,这也是这篇文章中我们使用的一个假设----**单向函数(O…