E. Xenia and Tree 分块 + LCA】的更多相关文章

http://codeforces.com/contest/342/problem/E 如果把询问1存起来,每到sqrt(m)的时候再处理一次. 那么总复杂度就是msqrt(m)的. 把要变颜色的节点存起来,可以同时一次O(n)的bfs 然后就是LCA了.LCA需要倍增的做法.这题真的是个好题.. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include…
Codeforce 342 E. Xenia and Tree 解析(思維.重心剖分) 今天我們來看看CF342E 題目連結 題目 給你一棵樹,有兩種操作,把某點標成紅色或者查詢離某點最近的紅點有多遠. 前言 這題我是當作學習重心剖分的習題看待的,最詳細的版本請看教學文 @copyright petjelinux 版權所有 觀看更多正版原始文章請至petjelinux的blog 想法 每兩個樹上的點,其重心剖分樹(CD樹)上的\(LCA\)一定在其最短路徑上.因此當我們把點\(v\)塗成紅色時,…
Description Xenia the programmer has a tree consisting of n nodes. We will consider the tree nodes indexed from 1 to n. We will also consider the first node to be initially painted red, and the other nodes — to be painted blue. The distance between t…
D. Happy Tree Party     Bogdan has a birthday today and mom gave him a tree consisting of n vertecies. For every edge of the tree i, some number xi was written on it. In case you forget, a tree is a connected non-directed graph without cycles. After…
http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. 手一抖,真的一生就毁了. 不到一小时打好的代码,硬是调试了2小时. 这什么水平. 到头来,和network那题的错误一样,都是很逗的地方,上次漏打id,这次漏打root. 调了一早上,无限吐槽一早上.差点让我以为自己人生没戏了. 吐槽完毕. 这题做法可以用树剖做,但是太麻烦. 我是看了别人用主席树加…
题意: 给一棵二叉排序树,找p和q的LCA. 思路: 给的是BST(无相同节点),那么每个节点肯定大于左子树中的最大,小于右子树种的最小.根据这个特性,找LCA就简单多了. 分三种情况: (1)p和q都在root左边,那么往root左子树递归. (2)在右同理. (3)一左一右的,那么root->val肯定大于其中的1个,小于另一个. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNod…
BaoBao has just found a rooted tree with n vertices and (n-1) weighted edges in his backyard. Among the vertices, of them are red, while the others are black. The root of the tree is vertex 1 and it's a red vertex.Let's define the cost of a red verte…
题目链接 Paths on the tree 来源  2014 多校联合训练第5场 Problem B 题意就是给出m条树上的路径,让你求出可以同时选择的互不相交的路径最大数目. 我们先求出每一条路径(u, v)中u和v的LCA:w,按照路径的w的深度大小deep[w]对所有的路径排序. deep[w]越大,排在越前面. 然后从第一条路径开始一次处理,看c[u]和c[v]是否都没被标记过,如果都没被标记过则我们把这条路径选上,把答案加1. 同时标记以w为根的子树的节点为1,方便后续对c数组的查询…
Problem Description Dylans is given a tree with N nodes. All nodes have a value A[i].Nodes on tree is numbered by 1∼N. Then he is given Q questions like that: ①0 x y:change node x′s value to y ②1 x y:For all the value in the path from x to y,do they…
Tree 题意: 给你一颗树, 每一个节点都有一个权值, 如果一个石头落在某个节点上, 他就会往上跳这个的点的权值步. 现在有2种操作, 1 把一个石头放在 x 的位置 询问有跳几次才跳出这棵树, 2 修改某个节点的权值. 解法:树上分块, 用dfs分好块之后. 对于每一块都处理出如果石头落在某个位置之后他跳出这个块之后的位置和次数. 每次更新都自己这一块的所有子节点, 然后找第k个父亲的时候用倍增优化. 对于每次询问都跳到0号点之后,返回所经过的次数. 我们可以对属于同一块内的节点重新建立边,…
HDU-3333 Turning Tree 题目大意:先给出n个数字.面对q个询问区间,输出这个区间不同数的和. 题解:这道题有几种解法.这里讲一下用分块解决的方法.( 离线树状数组解法看这里 Hdu-3333 Turning Tree (离线树状数组/线段树)~~~) 以(a[i]上一次出现的位置last, a[i])数字对作为基本元素做分块.那么容易想到对于每一个询问(l,r),如果该元素的last<l那么这个元素就应该加入到ans中.  那么我们对于每一个分块,以last作为关键字排序.对…
Expected diameter of a tree 我们先两次dfs计算出每个点能到达最远点的距离. 暴力计算两棵树x, y连边直径的期望很好求, 我们假设SZ(x) < SZ(y) 我们枚举 x 的每个端点, 二分找到分界点, 复杂度为SZ(x) * log(SZ(y)) 其实我们对于每次询问我们记忆化一下就可以啦. 这是因为对于SZ(x)小于 sqrt(n)的询问, 我们直接暴力求就好啦, 复杂度q * SZ(x) * log(SZ(y)) 对于SZ(x) > sqrt(n) 这样的…
题目链接 构建完MST后,枚举非树边(u,v,w),在树上u->v的路径中找一条权值最大的边(权为maxn),替换掉它 这样在 w=maxn 时显然不能满足严格次小.但是这个w可以替换掉树上严格小于maxn的次大边 用倍增维护MST上路径的最大值.次大值,每条非树边的查询复杂度就为O(logn) ps:1.倍增更新次大值时,未必是从最大值转移,要先赋值较大的次大值,再与较小的那个最大值比较. 2.maxn!=w时,是可以从maxn更新的(不能更新就是上面情况啊) 倍增处理部分我还是在dfs里写吧…
题目大意: 有一棵有根树,根为 1 ,点有点权.现在有 m 次操作,操作有 3 种:1 x y w ,将 x 到 y 的路径上的点点权加上 w (其中 w=±1w=±1 ):2 x y ,询问在 x 到 y 的路径上有多少个点点权 >0 :3 x ,询问在 x 的子树里的点有多少个点点权 >0 . 数据范围:$n,m≤10^5$,点权的绝对值$≤10^9$. 这一题正常的做法并不是特别优秀,我们考虑一些分块做法 考虑求一个连续的区间内有多少个数$>0$,我们显然可以将原序列分成$\sqr…
题意:给一棵树,每条边有一个权值,给两种操作,第一种是询问y向下整除从a到b的最短路径中每条边的权值后y的值,第二种是改变某条边的权值. 思路:y的最大值为1e18,最多除大于等于2的数不超过60次即可将y变为0,先dfs以任意一点为根建树,记录每个点的深度和它的父结点并将边权转化为点权, 再搞个并查集,将权值为1的点压缩,即使pre[u]=g[u];(u变成u的爸爸). #include<bits/stdc++.h> #define fi first #define se second us…
题目链接 题意:就是给你一颗这样的树,用一个$y$来除以两点之间每条边的权值,比如$3->7$,问最后的y的是多少,修改操作是把权值变成更小的. 这个$(y<=10^{18})$除的权值如果是$>=2$,那么最多除60几次就变成0了,问题关键是路径上会有好多1存在,这时候我们可以用并查集把他们并到一块,这样就能跳着查了. 具体查法: 从$u$到$LCA(u,v)$,路径上除一遍. 从$v$到$LCA(u,v)$,路径上除一遍. 修改操作如果变成1,就与前面的点合并. #include &…
题意:给定一棵有n个结点的树,每一个点有一个权值.共同拥有m个询问.对于每一个询问(u,v,k),回答结点u至v之间第k小的点的权值. 思路:主席树+lca.首先指定一个根结点dfs一次并在此过程中建好主席树.对于对于每一个询问,我们仅仅须要考虑四棵树,即T[u], T[v], T[lca(u,v)], 再加上T[fa( lca(u,v) )],fa( lca(u,v) )表示lca(u, v)的父亲结点. 这样一来问题就和线性序列里第k小的数一样了. #include<cstdio> #in…
题面 给你一棵 n n n 个结点的树,对于所有的 k ∈ [ 0 , n ] k\in[0,n] k∈[0,n] ,求出 M E X = k {\rm MEX}=k MEX=k 的路径数量. 一条路径的 M E X \rm MEX MEX 定义为该路径上没出现的最小结点编号(编号从 0 0 0 到 n − 1 n-1 n−1). 1 ≤ n ≤ 2 e 5 1\leq n\leq 2e5 1≤n≤2e5,多组数据. 题解 一条路径的 M E X \rm MEX MEX 恰好等于 k k k 的…
题目链接 2了,差点就A了...这题真心不难,开始想的就是暴力spfa就可以,直接来了一次询问,就来一次的那种,TLE了,想了想,存到栈里会更快,交又TLE了..无奈C又被cha了,我忙着看C去了...这题,是我一个地方写错了..top = 0的时候会死循环吗?貌似不会把,反正我加了这个判断,就A了,可能优化了一下把. #include <cstring> #include <cstdio> #include <string> #include <iostream…
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1444    Accepted Submission(s): 329 Problem Description Dylans is given a tree with N nodes. All nodes have a value A[i].Nodes…
You are given a tree with N nodes. The tree nodes are numbered from 1 to N. Each node has an integer weight. We will ask you to perform the following operation: u v k : ask for the kth minimum weight on the path from node u to node v Input In the fir…
leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree 1 题目 Binary Search Tree的LCA Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikiped…
标题效果:两棵树之间的首次查询k大点的权利. 思维:树木覆盖树,事实上,它是正常的树木覆盖了持久段树. 由于使用权值段树可以寻求区间k大,然后应用到持久段树思想,间隔可以做减法.详见代码. CODE: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 100010 #define NIL (tree[0]) using names…
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has…
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n<=500,000) 思路:k-d tree裸题. #include<cstdio> #include<algorithm> using namespace std; inline int read() { int x;char c; '); )+(x<<)+c-'; ret…
I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 5266 Description Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of the t…
[luogu P2633] Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. 输入输出格式 输入格式: 第一行两个整数N,M. 第二行有N个整数,其中第i个整数表示点i的权值. 后面N-1行每行两个整数(x,y),表示点x到点y有一条边. 最后M行每行两个整数(u,v,k),表示一组询问. 输出格式…
对于每个节点维护这个节点到根的权值线段树 对于每个询问(x,y),这条路径上的线段树 tree[x]+tree[y]-tree[lca(x,y)]-tree[fa[lca(x,y)]] #include<cstdio> #include<algorithm> using namespace std; ; ; int n,m,tot,cnt,ind,sz,last; int tmp[maxn],hash[maxn],g[maxn],v[maxn]; int num[maxn],pos…
分块LCA什么的,意外地快呢…… 就是对询问的3个点两两求LCA,若其中两组LCA相等,则答案为第三者. 然后用深度减一减什么的就求出距离了. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define maxn 500001 struct Graph {],first[maxn<<],next[maxn<<],w[maxn<<],…
求树上两条路径的 LCP (树上每个节点代表一个字符) 总共写+调了6个多小时,终于过了~ 绝对是我写过的最复杂的数据结构了 我们对这棵树进行轻重链剖分,然后把所有的重链分正串,反串插入到广义后缀自动机中. 求 LCP 的话就是后缀树中两点 $LCA$ 的深度. 如果 $LCP$ 的长度小于两个重链的长度,就直接输出答案,否则还要继续爬重链. 这道题恶心之处在于将所有重链不重不漏存起来,无法形容有多恶心. code: #include <cstdio> #include <cstring…