A Tree

LeetCode #188场周赛题解

六月ゝ 毕业季﹏ 提交于 2020-08-14 07:25:02
A题链接 给你一个目标数组 target 和一个整数 n。每次迭代,需要从 list = {1,2,3..., n} 中依序读取一个数字。 请使用下述操作来构建目标数组 target : Push:从 list 中读取一个新元素, 并将其推入数组中。 Pop:删除数组中的最后一个元素。 如果目标数组构建完成,就停止读取更多元素。 题目数据保证目标数组严格递增,并且只包含 1 到 n 之间的数字。 请返回构建目标数组所用的操作序列。 题目数据保证答案是唯一的。 示例 1 输入:target = [1,3], n = 3 输出:["Push","Push","Pop","Push"] 解释: 读取 1 并自动推入数组 -> [1] 读取 2 并自动推入数组,然后删除它 -> [1] 读取 3 并自动推入数组 -> [1,3] 示例 2: 输入:target = [1,2,3], n = 3 输出:["Push","Push","Push"] 示例 3: 输入:target = [1,2], n = 4 输出:["Push","Push"] 解释:只需要读取前 2 个数字就可以停止。 提示: 1 <= target.length <= 100 1 <= target[i] <= 100 1 <= n <= 100 target 是严格递增的 class Solution { public

【模板整合计划】高阶数据结构

故事扮演 提交于 2020-08-13 02:01:50
【模板整合计划】高阶数据结构 一:【并查集】 1.【路径压缩】 【模板】 并查集 \(\text{[P3367]}\) #include<cstdio> #define Re register int const int N=1e4+3; int n,x,y,T,op,fa[N]; inline void in(Re &x){ int f=0;x=0;char c=getchar(); while(c<'0'||c>'9')f|=c=='-',c=getchar(); while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar(); x=f?-x:x; } inline int find(Re x){return x==fa[x]?x:fa[x]=find(fa[x]);} int main(){ in(n),in(T); for(Re i=1;i<=n;++i)fa[i]=i; while(T--){ in(op),in(x),in(y); if(op<2){if(find(x)!=find(y))fa[find(x)]=find(y);} else puts(find(x)==find(y)?"Y":"N"); } } 2.【按秩合并(启发式合并)】 【模板】 并查集 \(\text{[P3367]}\) (1).【Deep】

【模版】莫队(带修改莫队、树上莫队)算法

时光总嘲笑我的痴心妄想 提交于 2020-08-09 17:21:03
莫队算法 莫队算法是 离线 解决 区间查询 问题的一种高效暴力算法。 前置知识点: ① ① ① 分块 ② ② ② s o r t sort s o r t 关键字排序 ③ ③ ③ l c a lca l c a 查询(树上莫队) 时间复杂度: O ( n ∗ n ) O(n*\sqrt{n}) O ( n ∗ n ​ ) 空间复杂度: O ( n + n ) O(n+\sqrt{n}) O ( n + n ​ ) 算法流程: 一、确定分块大小:每块大小为 n \sqrt{n} n ​ 。确定每个元素属于哪一块。 int part = sqrt ( n ) ; int num = ceil ( ( double ) n / part ) ; for ( int i = 1 ; i <= num ; i ++ ) for ( int j = ( i - 1 ) * part + 1 ; j <= i * part ; j ++ ) bel [ j ] = i ; 二、用结构体存储询问并用 s o r t sort s o r t 排序: 对于每次询问的 左端点 l l l ,按照 所在块 从小到大排序。 若左区间 l l l 所在块 相同,则按照 右端点 从小到大排序。 bool cmp ( pro a , pro b ) { return bel [ a . l ] == bel [

HDU

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-09 05:18:23
Counting Offspring HDU - 3887 You are given a tree, it’s root is p, and the node is numbered from 1 to n. Now define f(i) as the number of nodes whose number is less than i in all the succeeding nodes of node i. Now we need to calculate f(i) for any possible i. InputMultiple cases (no more than 10), for each case: The first line contains two integers n (0<n<=10^5) and p, representing this tree has n nodes, its root is p. Following n-1 lines, each line has two integers, representing an edge in this tree. The input terminates with two zeros. OutputFor each test case, output n integer in one line

洛谷 P2633 Count on a tree

我与影子孤独终老i 提交于 2020-08-08 19:52:47
思路 看到路径上 \(k\) 小值,首先想到主席树 不会主席树的建议来这里看一下 【AgOHの数据结构】主席树 (友情提示:此链接为B站视频 但是这是棵树,并不是序列,我们应该怎么办呢? 显然,我们可以像序列前缀和一样,建立树上前缀和:以点的 \(dfs\) 序为下标,以点权为区间建立主席树。 那么查询时 \((x,y)\) 这条链间的点数就是 \[sum[x]+sum[y]-sum[lca]-sum[fa[lca]] \] 这里用到了一点点树上差分的思想,自己思考一下 至于 \(LCA\) ,用树剖或者倍增求一下就好了 然后查询的时候就可以像序列上一样了 代码 /* Author:Loceaner */ #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int A = 5e5 + 11; const int B = 1e6 + 11; const int mod = 1e9 + 7; const int inf = 0x3f3f3f3f; inline int read() { char c = getchar(); int x = 0, f = 1; for ( ; !isdigit(c

洛谷 P2633 Count on a tree

有些话、适合烂在心里 提交于 2020-08-08 12:35:18
思路 看到路径上 \(k\) 小值,首先想到主席树 不会主席树的建议来这里看一下 【AgOHの数据结构】主席树 (友情提示:此链接为B站视频 但是这是棵树,并不是序列,我们应该怎么办呢? 显然,我们可以像序列前缀和一样,建立树上前缀和:以点的 \(dfs\) 序为下标,以点权为区间建立主席树。 那么查询时 \((x,y)\) 这条链间的点数就是 \[sum[x]+sum[y]-sum[lca]-sum[fa[lca]] \] 这里用到了一点点树上差分的思想,自己思考一下 至于 \(LCA\) ,用树剖或者倍增求一下就好了 然后查询的时候就可以像序列上一样了 代码 /* Author:Loceaner */ #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int A = 5e5 + 11; const int B = 1e6 + 11; const int mod = 1e9 + 7; const int inf = 0x3f3f3f3f; inline int read() { char c = getchar(); int x = 0, f = 1; for ( ; !isdigit(c

P3037 [USACO11DEC]Simplifying the Farm G[最小生成树]

女生的网名这么多〃 提交于 2020-08-04 19:29:30
前言 \(Kruscal\) 的进一步应用以及 \(set\) 去重应用,输入输出没翻译,练习一下英语水平吧 (其实是懒得搞) (逃 题目描述 Farmer John has been taking an evening algorithms course at his local university, and he has just learned about minimum spanning trees. However, Farmer John now realizes that the design of his farm is not as efficient as it could be, and he wants to simplify the layout of his farm. The farm is currently arranged like a graph, with vertices representing fields and edges representing pathways between these fields, each having an associated length. Farmer John notes that for each distinct length, at most three pathways on his

主席树专题

浪子不回头ぞ 提交于 2020-08-04 15:07:04
主席树专题 题目 难度 题解 K-th Number 模板题 点这里 P2633 Count on a tree 入门 点这里 Distance on the tree (2019南昌网络赛) 入门 点这里 HDU-3333 较难 点这里 P2617 Dynamic Rankings 动态主席树入门 点这里 ZOJ 2112 动态主席树入门(空间优化) 点这里 CodeForces - 484E 二分+主席树 点这里 K-th Closest Distance 二分+主席树 点这里 来源: oschina 链接: https://my.oschina.net/u/4335726/blog/4357892

LCA 最近公共祖先 ( Tarjan算法详解+模板代码 )(转)

生来就可爱ヽ(ⅴ<●) 提交于 2020-07-26 05:02:21
一.LCA详解 转自: https://www.cnblogs.com/ECJTUACM-873284962/p/6613379.html 首先是最近公共祖先的概念(什么是最近公共祖先?):     在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。     换句话说,就是两个点在这棵树上距离最近的公共祖先节点。     所以LCA主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径。     有人可能会问:那他本身或者其父亲节点是否可以作为祖先节点呢?     答案是肯定的,很简单,按照人的亲戚观念来说,你的父亲也是你的祖先,而LCA还可以将自己视为祖先节点。     举个例子吧,如下图所示4和5的最近公共祖先是2,5和3的最近公共祖先是1,2和1的最近公共祖先是1。      这就是最近公共祖先的基本概念了,那么我们该如何去求这个最近公共祖先呢?     通常初学者都会想到最简单粗暴的一个办法:对于每个询问,遍历所有的点,时间复杂度为O(n*q),很明显,n和q一般不会很小。     常用的求LCA的算法有:Tarjan/DFS+ST/倍增     后两个算法都是在线算法,也很相似,时间复杂度在O(logn)~O(nlogn)之间,我个人认为较难理解。     有的题目是可以用线段树来做的

进程监控类命令

喜欢而已 提交于 2020-07-24 09:15:50
进程监控类命令 本篇全是命令介绍 , 笔者把各个命令的都实验一遍 , 给同学们看看 . 一. PSTREE 命令 pstree - display a tree of processes 选项 :   -p 显示进程的 PID   -T 隐藏线程信息   -u 显示切换过程   -H PID 高亮显示指定 PID 进程的父进程 示例 : 二. PS 命令 ps - report a snapshot of the current processes. 选项 : PS 有三种风格的选项写法 :   BSD 风格写法 ps aux   UNIX 风格写法 ps -ef   GNU 风格写法 ps --pid PID BSD 风格选项 :   a 显示所有与终端有关的进程   x 显示所有与终端无关的进程   u 显示进程所有者相关的信息   f 命令列把相关的进程显示成进程树   k 对属性进行排序 , 属性前加上 - 表示倒序   o 选择显示的字段 pid cmd psr ni(nice) pri rtprio tid class %cpu %mem user ruser euser 等等   euser 表示显示有效用户字段   ruser 表示显示真是用户字段   psr 表示显示 CPU 与进程的绑定关系   pcpu CPU 的利用率   ppid 父进程的 PID