题目地址:https://oj.neu.edu.cn/problem/1204 题目大意: 其实就是树上的线段覆盖, 给出一棵n个结点的树,然后给出树上的一些路径进行覆盖,然后要求选取最少的点,能够把这些线段都占有 (或者说:一开始树上每个结点权值都为0,选取最少的点,把它们的权重变成1,使得询问的每一条路径上有含有权值为1的结点) 题解: 类似线段覆盖(线段覆盖是按照右端点贪心) 这个题就是按照每个路径的lca的深度贪心 也就是说把询问按照lca的深度从大到小排序 然后依次枚举询问 如果当前询…
题目描述 有一棵树,每个结点有一个灯(初始均是关着的).每个灯能对该位置和相邻结点贡献1的亮度.现有两种操作: (1)将一条链上的灯状态翻转,开变关.关变开: (2)查询一个结点的亮度. 数据规模:\(1 \le n,q \le 10^5\) 简要题解 对于这种题,很容易想到任意指定一个根转化为有根树,每个结点维护值\(a_i\)表示它的所有儿子的贡献之和,这样再加上自己以及父亲的贡献就能回答一个询问了. 然而经过一波思考发现问题在于链修改时根本没法维护\(a_i\).因此需要用链修改时的常规操…
题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需要统计每个点与\(k\)的lca深度.这个东西等价于所有的链与\(k\)到根的链的并. 树剖+主席树维护一下.这题的主席树需要区间加1,可以标记永久化合并标记 复杂度\(O(n\log ^2n)\) #include<bits/stdc++.h> #define Pair pair<LL,…
链接:https://nanti.jisuanke.com/t/38229 题意: 给一棵树,多次查询,每次查询两点之间权值<=k的边个数 题解: 离线询问,树链剖分后bit维护有贡献的位置即可 #include <bits/stdc++.h> #define rep(ii,a,b) for(int ii=a;ii<=b;++ii) using namespace std; const int maxn=2e5+10,maxm=2e6+10; int n,m; #define tp…
学了差不多一星期的主席树+树链剖分,再来看这题发现其实是个板子题 一开始想复杂了,以为要用类似求树上第k大的树上差分思想来解决这道题,但其实树链上<=k的元素个数其实直接可以用树链剖分来求 具体是把每条树链放到主席树上询问一下求和就好了 #include<bits/stdc++.h> using namespace std; #define maxn 100006 ]; int b[maxn],n,m,a[maxn],head[maxn],tot; ,;} void addedge(in…
传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说,这道题,一眼看去,就是树链剖分,然鹅,太久没写树链剖分的我一时也木有思路: 今天上午把树链剖分温习了一遍,做了个模板题: 下午再想了一下这道题,思路喷涌而出............ 首先,介绍一下相关变量: int fa[maxn];//fa[u]:u的父节点 int son[maxn];//son…
题目链接 就是恶心人的,简单写写了...(似乎就是[HNOI2015]开店?) 拆式子,记\(dis_i\)为\(i\)到根节点的路径权值和,\(Ans=\sum dis_{p_i}+\sum dis_k-2\sum dis_{LCA(p_i,k)}\).\(\sum dis_{LCA(p_i,k)}\)的求法类似[LNOI2014]LCA,在每个\(u\to v\)路径上,每个\(p_i\)到根节点的路径上权值\(+1\)(本题就是下放点权,每次所有点的\(sum\)加上它的点权),然后求一遍…
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(National Olympiad in Informatics in Provinces) in Senior High School. So when in Data Structure Class in College, he is always absent-minded about…
题意 给一颗带点权的树,三种操作 \(1~s~t\) 修改从1到s的路径上的所有点,\(a[i]=a[i]|t\) \(2~s~t\) 修改从1到s的路径上的所有点,\(a[i]=a[i]\&t\) \(3~s~t\) 询问将1到s的路径上的所有点作为石头堆,再加上一个个数为\(t\)的石头堆,进行一次尼姆博弈,先手胜利输出YES,否则输出NO 分析 尼姆博弈先手必胜条件为所有石头堆异或和为0,将询问转化为求1到s的路径上的所有点的异或和, 先树链剖分一下给每个点重新编号,然后线段树维护区间异或…
题目链接:https://nanti.jisuanke.com/t/39272 题意:给一棵树,n个结点,树根为1,n-1条边,每个结点有一个权值.进行3种操作: 1 s t:把1和s之间的最短路径上的所有结点|t. 2 s t:把1和s之间的最短路径上的所有结点&t. 3 s t:把1和s之间的最短路径上的所有结点进行异或,若结果等于t则输出NO,否则输出YES.(不理解的话可以看一下nim博弈论) 思路:很明显的一道题树链剖分题,难的是怎么维护线段树.我们拆成二进制来看,用num[32]维护…