HDU6430 Problem E. TeaTree【dsu on tree】】的更多相关文章

Problem E. TeaTree Problem Description Recently, TeaTree acquire new knoledge gcd (Greatest Common Divisor), now she want to test you. As we know, TeaTree is a tree and her root is node 1, she have n nodes and n-1 edge, for each node i, it has it's v…
Problem E. Split The Tree Problem Description You are given a tree with n vertices, numbered from 1 to n. ith vertex has a value wi We define the weight of a tree as the number of different vertex value in the tree. If we delete one edge in the tree,…
Description 给定一棵 \(n\) 个节点的树,每条边上有一个字符,字符集大小 \(22\),求每个节点的子树内最长的简单路径使得路径上的字符经过重排后构成回文串. Limitation \(1~\leq~n~\leq~500000,~\text{字符集}~=~['a',~'v']\) Solution 考虑一条路径能构成回文串当且仅当路径上的字符出现奇数次的至多为一个.由于字符集大小很小,我们考虑状态压缩,即每个字符对应二进制位上的一个 \(1\).考虑从每个点出发向下走,显然链长越…
Boring counting Problem Description In this problem we consider a rooted tree with N vertices. The vertices are numbered from 1 to N, and vertex 1 represents the root. There are integer weights on each vectice. Your task is to answer a list of querie…
题意: 一棵树,询问一个子树内出现次数$≥k$的颜色有几种 强制在线见上一道 用莫队不知道比分块高到哪里去了,超好写不用调7倍速度!!! 可以用分块维护出现次数这个权值,实现$O(1)-O(\sqrt{N})$修改查询 [update 2017-03-22]还可以用dsu on tree做,并不想再写了... #include <iostream> #include <cstdio> #include <algorithm> #include <cstring&g…
Query on A Tree Problem Description Monkey A lives on a tree, he always plays on this tree. One day, monkey A learned about one of the bit-operations, xor. He was keen of this interesting operation and wanted to practise it at once. Monkey A gave a v…
题目: Invert Binary Tree Total Accepted: 20346 Total Submissions: 57084My Submissions Question Solution  Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 Trivia:This problem was inspired by this original tweet by Max Howell:…
题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 代码: /** * Definition for a bina…
平衡的二叉树的定义都是递归的定义,所以,用递归来解决问题,还是挺容易的额. 本质上是递归的遍历二叉树. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给定一个二叉树,判定他是不是高度平衡的二叉树. 对于这个问题,每个节点的两个子树的深度不会相差超过1,那么这样的二叉树就是一个平衡的二叉树 +++++++++++++++++++++++++++++++++++++++++++++…
题目链接:id=3468">http://poj.org/problem?id=3468 题目大意:给出一组数组v[i],有两种操作,一种给出两个数a,b.要求输出v[a]到v[b]之间的和.还有一种给出三个数a,b,c,让v[a]到v[b]之间的数全都加上c. 全然是树状数组可以实现的功能,可是假设就这样单纯的套用模板,做另外一种操作是更新每一个值,这种操作就有可能超时. 换一种思路,既然另外一种操作是给某区间上的全部数加上同样的值,那么应该是可以简化的才对. 如果数组sum[i]为原数…
Problem J: 幻化 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 18 Solved: 3 [Submit][Status][Web Board] Description 遇见你是我一世的春暖花开, 从此清风明月浩瀚星海. 不论结局,很高兴认识你. 她给了他一个长度为n的整数序列a[],他还给了她另外一个长度为n的整数序列b[],现在他想通过每次交换a[i],a[j]使序列a变成b,但是每次交换的代价是|j-i|. 请问最少的代价是多少呢?…
题目链接:BZOJ - 1036 题目分析 这道题可以用树链剖分,块状树等多种方法解决,也可以使用 LCT. 修改某个点的值时,先将它 Splay 到它所在的 Splay 的根,然后修改它的值,再将它 Update 一下. (1) 询问 x, y 两点之间的路径时,假设 x 是深度小的那一个,先 Access(x) ,然后再 Access(y) 的返回值就是 x, y 的 LCA . 这时从 x 到 LCA 的路径已经在 LCA 处断开了.我们将 x Splay 一下,然后就是 x 所在的 Sp…
题意比较难理解,就是给你n个点的树,然后给你m个修改操作,每一次修改包括一个点对(x, y),意味着将x到y所有的点权值加一,最后问你整个树上的点权最大是多少. 比较裸的树链剖分了,感谢Haild的讲解. 首先第一遍dfs预处理出size,son(重儿子). 第二遍dfs重编号. 然后线段树就可以了. 感觉就是把一棵树弄成一条一条的链,新奇的hash方法. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <=…
题意:求出所有w^i使得l<=w^i<=r 输入为一行,有三个数,分别是l,r,w.意义如题目所描述 输出为一行,输出所有满足条件的数字,每两个数字中间有一个空格 如果没有满足条件的数字则输出-1 水题: 没什么思路可言,大力暴算才是正解 然后需要注意两个坑点: 1,w=1这个时候需要特判,不然会T死 2,我们循环的条件是l<=w^i<=r,每次乘w,如果r->1e18,当记录w^i的变量逼近1e18却仍小于r时,它会再次乘w,观察到w最大能到1e9,再乘的话就会爆掉long…
有关dfs序的例题,需要有一定的位运算基础 题面 给定一个树,树上有颜色,将某一子树的颜色统一修改,求子树中颜色的数量 Solution 子树修改,子树求和,dfs序的知识(类似区间修改区间求和) 考虑到颜色的个数问题,利用位运算进行表示. 最后答案用二进制表示,\(\ 1\)表示有该种颜色,\(\ 0\)表示没有, 因此还需考虑答案\(\ 1\)的数量. dfs序问题自然用到线段树进行维护. 具体介绍一下位运算,和一些小错误 方案总数不是两个节点维护的方案数的简单相加,而是"|"(或…
[模板整合计划]图论-有向无环图 (DAG) 与树 一:[拓扑排序] 最大食物链计数 \(\text{[P4017]}\) #include<cstring> #include<cstdio> #include<queue> #define Re register int using namespace std; const int N=5003,M=5e5+3,inf=2e9,P=80112002; int n,m,x,y,o,ans,dp[N],ru[N],chu[…
[题意]给定n个点的树,每条边有一个小写字母a~v,求每棵子树内的最长回文路径,回文路径定义为路径上所有字母存在一种排列为回文串.n<=5*10^5. [算法]dsu on tree [题解]这题经典套路就是按照22个字母个数的奇偶性压位,然后两段路径异或起来是0或1<<j就是合法路径. dsu的时候每个点统计其子树内经过这个点的路径,注意包括从子树到该点终止的和该点自身也要算. 那么类似点分治的方式,算完重儿子后处理一下根,然后就一棵一棵轻儿子子树和之前的子树状态桶数组统计然后加入.…
[题目]E. Lomsat gelral [题意]给定n个点的树,1为根,每个点有一种颜色ci,一种颜色占领一棵子树当且仅当子树内没有颜色的出现次数超过它,求n个答案——每棵子树的占领颜色的编号和Σci(一棵子树可能有多种占领颜色).1<=n,ci<=10^5. [算法]dsu on tree [题解]入门题,讲一下dsu on tree算法. 一.dsu on tree的适用范围:①子树询问,②支持数组上的快速信息加,③不带修.(注意不需要支持信息删除,只需要能清空信息) 如果写暴力的时候,…
[CF600E]Lomsat gelral(dsu on tree) 题面 洛谷 CF题面自己去找找吧. 题解 \(dsu\ on\ tree\)板子题 其实就是做子树询问的一个较快的方法. 对于子树的询问,我们不难想到子树就是\(dfs\)序上的连续一段, 可以把树转化成序列再用莫队来解. 其实可以对树进行树链剖分,然后暴力+优化来解 具体的做法就是: 递归处理轻儿子,计算轻儿子答案, 然后消去轻儿子对于答案的影响. 然后递归处理重儿子,不消去影响,最后加入所有轻儿子贡献,计算答案. 复杂度?…
[UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就一定会匹配完,所以\(dp\)可以做到线性. 那么根据上面的\(dp\)方式,一条边会被匹配到,当且仅当把这条边删掉之后,两个连通块内分别有奇数个目标点.那么如果我们考虑枚举每一条边,然后把子树内的点给标记一下,于是变成了在原序列上求有多少个偶数区间满足有偶数个点被标记,这个问题可以做一个前缀和,把…
[题解]CF741D(DSU on TREE) 写一写这道题来学习学习模板 用二进制来转换一下条件,现在就是要求一下\(lowbit(x)=x\)的那些路径了. DSU on TREE 是这样一种算法: 像树剖一样分出轻重链,根据那套理论可知轻边\(O(\log n)\). 递归处理一个节点的所有轻儿子,并且回溯的时候将统计信息清空. 递归处理一个节点的那个重儿子,并且回溯的时候保留统计信息. 获得重儿子信息后,遍历一下所有轻儿子统计答案. 分析复杂度:对于每个点,可以被他父亲所有的轻边多遍历一…
十几天前看到zyf2000发过关于这个的题目的Blog, 今天终于去学习了一下 Codeforces原文链接 dsu on tree 简介 我也不清楚dsu是什么的英文缩写... 就像是树上的启发式合并 用到了\(heavy-light\ decomposition\)树链剖分 把轻边子树的信息合并到重链上的点里 因为每次都是先dfs轻儿子再dfs重儿子,只有重儿子子树的贡献保留,所以可以保证dfs到每颗子树时当前全局维护的信息不会有别的子树里的,和莫队很像 算法过程 find the BigC…
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ266.html 题解 首先我们可以直接暴力 $O(n^2)$ 用 sg 函数来算答案. 对于一个树就是枚举一下从根出发到哪一个节点为止的路径被删掉了,剩下所有的子树的sg值xor起来,对于每一个路径后的答案取一个 mex . 我们考虑快速的做这个过程. 直接写个 Trie 再 DSU on tree 就好了,只要支持查询 mex 和整棵 trie 对某一个值 xor 这两种操作就好了. 时间复杂度 $O…
Prelude 很好的模板题. 传送到Codeforces:(* ̄3 ̄)╭ Solution 首先要会DSU on Tree,不会的看这里:(❤ ω ❤). 众所周知DSU on Tree是可以用来处理子树信息的,但是有时候也可以用来处理链上信息. IOI 2011 Race是一道著名的点分治模板题,要求统计链信息,也可以用DSU on Tree来做,题目链接在这里:(✿◕‿◕✿). 基本思路和点分治是一样的,对于每个点u,我们统计出所有经过u的路径的信息. 于是我们有了一个非常好的思路:统计每…
传送门 题意: 给出一颗含有\(n\)个结点的无根树,之后给出一个长度为\(m\)的序列,每个元素在\([1,n]\)之间. 现在序列中每个长度为偶数的区间的完成时间定义为树上最小配对方法中每对匹配点间距离的总和. 现在要求所有长度为偶数的区间的完成时间的和. 思路: 首先不妨将这颗树转化为有根树,最终不会影响答案. 注意到性质:偶数个点的两两匹配方式是唯一的,都是最深的两个点相互匹配,这样才能保证没有重复计算的边. 在子树内部直接计算不好算,要考虑很多东西(一开始就想偏了QAQ).因为匹配方式…
传送门 题意: 给出一颗以\(1\)为根的有根树,树边带有一个字符(\(a\)~\(v\))的信息. 输出对于每个结点,其子树内最长的简单路径并且满足边上的字符能够组成回文串. 思路: 显然最终的答案分为两部分,子树内部的答案,经过当前根结点的答案. 第一种答案很好处理.类似于点分治,主要处理第二种答案. 树上路径可以考虑找到\(lca\),维护点到根节点的信息. 题目中的回文串可以等价于,出现奇数次的字符不超过\(1\)个.我们将字符状压一下,那么维护点到根的信息就很方便了:同理求出两点间的信…
传送门 题意: 求子树众数. 思路: \(dsu\ on\ tree\)模板题,用一个桶记录即可. 感觉\(dsu\ on\ tree\)这个算法的涉及真是巧妙呀,保留重链的信息,不断暴力轻边,并且不断在子树内递归下去.又由于轻边数量不会超过\(O(logn)\),所以总的时间复杂度控制在\(O(nlogn)\). /* * Author: heyuhhh * Created Time: 2019/11/13 15:09:25 */ #include <bits/stdc++.h> #defi…
传送门 题意: 给出一个以\(1\)为根的有根树.之后有\(m\)个询问,每个询问为\(v_i,h_i\),需要回答以\(v_i\)为根的子树中,深度为\(h_i\)的那些结点所代表的字符能否构成回文串. 思路: 静态子树询问,考虑\(dsu\ on\ tree\). 深度可以提前处理出来.对一个子树处理时,用一个数组\(d[deep][cnt]\)来记录. 最后直接根据深度枚举判断即可. 正确性的话是基于算法本身的,我们考虑一个子树时,数组中目前只会储存这颗子树内部的信息. /* * Auth…
传送门 题意: 给出一颗以\(1\)为根的有根树,每个结点有个颜色\(c_i\). 之后要回答\(m\)组询问,每组询问包含\(v_i,k_i\),要回答以\(v_i\)为根的子树中,颜色出现次数不小于\(k_i\)的颜色的和. 思路: 这种静态子树上的问题,可以考虑dsu on tree. 由于要回答次数超过\(k\)的颜色和,那么建立一颗线段树,以出现次数为横坐标,维护颜色的和. 由于\(dsu\ on\ tree\),每个点会被访问\(O(logn)\)次,因为每个结点有修改操作,所以会多…
dsu on tree的本质是树上的启发式合并,它利用启发式合并的思想,可以将O(N^2)的暴力优化成O(NlogN),用于不带修改的子树信息查询. 具体如何实现呢?对于一个节点,继承它重儿子的信息,轻儿子直接dfs统计,更新完本节点的答案后,再dfs一次清除轻儿子的信息,相当于一个启发式合并的过程,因为一次合并会使得被遍历的子树变大一倍,所以一棵子树最多遍历logn次,也就是一个点最多被遍历logn次,于是最劣复杂度为O(NlogN). dsu on tree的具体流程 dfs计算轻儿子的答案…