树剖模板by fcdalao】的更多相关文章

#include<bits/stdc++.h> using namespace std; ; *MX]; *MX]; int n,Index,fir[MX],fa[MX],dfn[MX],dep[MX],siz[MX],son[MX],Top[MX],w[MX],bel[MX],dfs_cnt; inline void ins(int u,int v){e[++Index]=(Edge){v,fir[u]},fir[u]=Index;} void dfs1(int x){ siz[x]++,d…
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,分别表示树的结点个数.操作个数…
原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include<cstdio> #include<algorithm> #include<cstring> #define N 100010 typedef long long ll; using namespace std; int ecnt,head[N],son[N],fa[N],sz[N…
HDU - 3966 思路 :树链剖分就是可以把一个路径上的点映射成几段连续的区间上.这样对于连续的区间可以用线段树维护, 对于每一段连续的区间都可以通过top [ ]数组很快的找到这段连续区间的头.跳的过程类似于 lca ,但这里 要注意的是 每一个点只属于一条链. (重载运算符时要注意   node 一个 新的结点,不要 乱用*this 指针) #include<bits/stdc++.h> using namespace std; #define MID int m = (l+r)/2…
洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\sum\limits_ {j=1}^ia_ j\) 显然有\(a_ i=\sum\limits_ {j=1}^id_ j\) 于是大力展开得到 \[s_i=\sum\limits_{j=1}^i(i-j+1)d_j\] \[s_i=(i+1)\sum\limits_{i=1}^jd_j-\sum\lim…
***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的了...树剖模板题(然鹅我是不会告诉你们我因为把int打成char查了好久好久代码滴...) 细节问题:为了便于处理把每个节点编号都加上1,避免一些不必要的错误 P.S.打完才发现好像不用区间查询 代码: #include<cstdio> #include<cctype> #inclu…
UVA1674 闪电的能量 树剖 题面 水.树剖模板 #include <cstdio> #include <cstring> #include <algorithm> #define MAXN 50005 #define sl (x<<1) #define sr (x<<1|1) #define ll long long using namespace std; int head[MAXN],vv[MAXN*2],nxt[MAXN*2],tot…
不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来一个方法:先记下前两个的最长公共子序列(可能有多个),然后再一一与第三个字符串比较,找出三者的最长公共子序列.然后就GG了.想不通,思路应该是对的啊.所以又留了一道题来想. 然后三维的状态转移很好写. #include<iostream> #include<cstdio> #inclu…
1.tarjan求lca 思想: void tarjan(int u,int f){ for(int i=---){//枚举边 if(v==f) continue; dfs(v); //继续搜 unionn(v);//合并 vis[v]=; //标记 } for(int i){// 和u有关的询问 if(vis[v]) lca=find(v); //若访问过,lca为find(v) } } 模板代码 #include<bits/stdc++.h> #define rep(i,x,y) for(…
You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose label is k-th largest in the subtree of the node x. Assume no two nodes have the same labels. Input The first line contains one integer n (1 <= n <=…
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5221 题意:给你一棵树,每个节点有一定的值,有三种操作: 1 x y 表示占领树上x-y的所有节点,2 x 表示去掉这点,3 x表示占领以这个节点为根的所有节点 题解:1 2 都是树剖操作,3则要记录树剖的时间戳,一个根节点下的点的新编号都是连续的,所以只要记录该根节点的最大时间戳就知道这个区间了 #include<cstdio> #pragma comment(linker, "/ST…
题目链接: TP 题解:   可能是我比较纱布,看不懂题解,只好自己想了…… 先附一个离线版本题解[Ivan] 我们考虑对于询问区间是可以差分的,然而这并没有什么卵用,然后考虑怎么统计答案. 首先LCA一定是z的祖先(这里说的祖先包括自己,以下祖先均为此概念)节点,也就是是说我们只要计算出每个祖先节点的贡献就可以了,再考虑每个祖先的贡献如何计算. 我们发现对于深度其实是该点到root的路径点数,所以我们可以这样想,我们询问z的祖先的答案,就是在计算有对于给定区间有多少个点经过了z的祖先. 那么思…
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的边在下一条询问中依然存在) Input 第一行两个正整数N,M(N<=50000,M<=100000)表示原图的顶点数和边数. 下面M行,每行三个整数X,Y,W描述了图的一条边(X,Y),其边权为W(W<=10000).保证两点之间至多只有一条边. 接着一行一个正整数Q,表示询…
BZOJ_3626_[LNOI2014]LCA_离线+树剖 题意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. 有q次询问,每次询问给出l r z,求sigma_{l<=i<=r}dep[LCA(i,z)]. (即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和) 分析: 求sigma_{l<=i<=r}dep[LCA(i,z)]相当于把…
BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树 题意: 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. 分析: 每个结点开线段树,保存到根这段路径上的权值,然后类似树上差分在主席树上求第k小 代码: #include <stdio.h> #include <string.h> #in…
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个 结点,可以打多次标记.)2. 询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖 先)你能帮帮他吗? Input 输入第一行两个正整数N和Q分别表示节点个数和操作次数…
BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有一条路径.换句话说, T 城中只有N − 1 座桥.Ray 发现,有些桥上可以看到美丽的景色,让人心情愉悦,但有些桥狭窄泥泞,令人烦躁.于是,他给每座桥定义一个愉悦度w,也就是说,Ray 经过这座桥会增加w 的愉悦度,这或许是正的也可能是负的.有时,R…
前置芝士:[LNOI2014]LCA 要是这题放HNOI就好了 原题:\(\sum_{l≤i≤r}dep[LCA(i,z)]\) 这题:\(\sum_{i≤r}dep[LCA(i,z)]^k\) 对于原题,我们需要把每个询问拆成1~l-1 & 1~r再进行差分(所以这题帮我们省去了一个步骤) 先考虑\(k=1\)原题 我们先转化题意 \(dep[lca]\)\(\\)==\(\\)\(dis[1][lca]+1\)\(\\)==\(\\)\(lca->1\)的点数 所以我们每一个点(x)对答…
这里只简单给出几个常用的字典树的模板,要看具体介绍的请看:传送门 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).   Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.…
题目大意 给你一棵树,有\(n\)个点.有\(q\)个操作,每次要你从\(x\)到\(y\)的路径上选两个点,使得距离\(x\)比较远的点的点权\(-\)距离\(x\)比较近的点的点权最大,然后把这条路径上所有点的点权\(+v\). \(n,q\leq 50000\) 题解 这种题没什么意思,直接树剖就好了. 线段树上每个点记录最大值,最小值,从左往右走和从右往左走的最大收益. 时间复杂度:\(O(n+q\log^2 n)\) 代码 #include<cstdio> #include<c…
题目链接 loj luogu 题意 求树上路径最大点权异或和 自然想到(维护树上路径)+ (维护最大异或和) 那么有三种方法可以选择 1.树剖+线性基 2.倍增+线性基 3.点分治+线性基 至于线性基的合并 一共就是long级的 暴力合并就好啦 这是一份在loj T掉在洛谷AC的可怜代码 #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include…
https://www.lydsy.com/JudgeOnline/problem.php?id=3531 首先这题意要求树链上的最大值以及求和,其树链剖分的做法已经昭然若揭 问题在于这次的信息有宗教条件下的限制,导致不那么容易维护. 第一个想法自然是对于每一个宗教都建一颗线段树,看一下数据范围,宗教的范围是1e5,N的范围也是1e5,又好像空间不那么允许. 事实上可以采用动态线段树的方法节省一波空间,整个做法就变得科学了起来. 如果不是因为我的愚蠢在树剖的重链部分写挂了导致T了很久,这题还是很…
Solution 在步伐$pace$比较小的时候, 我们发现用前缀和直接维护会很快 而在$pace$比较大的时候, 则暴力往上跳会最优 设$blo= \sqrt{N}$ 若$pace<=blo$, 则利用前缀和更新, 预处理复杂度$O(N \sqrt{N})$, 查询复杂度$O(1)$ 若$pace>blo$,则利用树剖逐渐往上跳 总共要跳$N/pace$次, 一共有$logN$条轻重链, 复杂度为$O(logN+ \sqrt{N})$ 代码实现比较麻烦, 我常数写的还很差, 水平低啊QAQ…
题目大意:有一颗有$m$个叶子节点的二叉树. 对于叶子节点$i$,$x[i]=(a[i]\ xor\ V_{p[i]})or(b[i]\ xor\ V_{q[i]})$ 对于非叶子节点$i$,$x[i]=x[sonl]\ and\ x[sonr]$. 上文的$or$和$xor$均为逻辑运算符.且V为一个长度为$n$的布尔数组,需要你自己构造. 下面问:对于每个非叶子节点$i$,问是否存在一个序列V,使得$x[i]=true$. 数据范围:$n,m≤2\times 10^{5}$ 我们先来考虑下暴…
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的输出状态只有\(0/1\),于是每个点的总状态也非常有限,可以根据权值为\(1\)的儿子数量\(0-3\)分为四种,记为该点的点权. 我们都会模拟暴力过程--先改叶子节点(先默认为\(0\)改为\(1\)),如果它的父亲此时权值为\(1\)的儿子数量从原来小于\(0\)的变成大于\(0\)的,那么父…
容易得出,如果我们按照深度一层一层地做,做完一层后,这层某个点的答案就是它的祖先们的子树大小(统计大小时不包括树根) 由于我太菜了不会别的方法,虽然N是5e5的,还是只好用一个树剖(树状数组降常数)水过去了 就是统计到某个点的时候把它的父亲到根+1 #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) using namespace std; typedef l…
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树所有子连通块的点权和中的最大值 (本题中子连通块包括空连通块,点权和为0). Input 第一行两个整数n.m,表示树的点数以及操作的数目. 第二行n个整数,第i个整数w_i表示第i个点的点权. 接下来的n-1行,每行两个整数x.y,表示x和y之间有…
题面:https://www.lydsy.com/JudgeOnline/problem.php?id=2238 思路:先求个最小生成树,然后就对最小生成树上的边做树剖,依次对非树边进行处理,维护非树边两端连成的路径的最小值(用非树边的权值维护),然后对于每个询问,求出覆盖在那条线段上的最小值,用real_sum(最小生成树的边权和)去加加减减就行了. #include<cstdio> #include<iostream> #include<cstring> #incl…
题面:月下“毛景树” 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来,可以发现a到b节点间的边权max实质是a节点到b节点的路径中a下移一位后到b节点的点权max,意味着:若dep[a]<dep[b](若不是这样可交换),找点权max上跳时不能到LCA(a,b):因为重边会是连续的,所以直接(seg记录节点在线段树中的下标)seg[a]+1到seg[b]就可以了.然后要注意flag1和f…
目录 链接 思路 update 代码 链接 https://www.luogu.org/problemnew/show/P4069 思路 树剖+超哥线段树 我已经自毙了,自闭了!!!! update 上次抄了没认真看,这次考试又自毙了 是一个细节的处理上一次没处理 代码 #include <bits/stdc++.h> #define ll long long #define ls rt<<1 #define rs rt<<1|1 using namespace std…