bzoj3626【LNOI2014】LCA】的更多相关文章

3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1266  Solved: 448 [Submit][Status][id=3626" style="color:blue; text-decoration:none">Discuss] Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0). 一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点…
题面 题解 考察\(dep[\mathrm{LCA}(i, x)]\)的性质,发现它是\(i\)和\(x\)的链交的长度. 那么对每个\(i\)所在的链打一个区间加标记,询问时算一下\(x\)所在的链的区间和即可. 如果有\(l \leq i \leq r\)的限制,就进行离线处理即可. 代码 好久之前的代码,有点丑见谅. #include<bits/stdc++.h> #define RG register #define file(x) freopen(#x".in",…
Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设$dep[i]$表示点i的深度,$lca(i,j)$表示i与j的最近公共祖先.有q次询问,每次询问给出l,r,z,求$\sum\limits_{i=l}^{r}dep[lca(i,z)]$.(即求在$[l,r]$区间内的每个节点i与z的最近公共祖先的深度之和) $n,q<=50000$ Input 第一行2个整数n,q.接下来n-1行,分别表示点1到点n-1的父节点编号.…
(7.16晚)更完先在B站颓一会儿-- --------------------------------------------------------------- (以下为luogu题面) 题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1. 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先. 有q次询问,每次询问给出l r z,求∑(l≤i≤r ​dep[LCA(i,z)]) 输入输出格式 输入格式: 第一行2…
我校是神校,作业竟然选自POJ,难道不知道“珍爱生命 勿刷POJ”么? 所有注明模板题的我都十分傲娇地没有打,于是只打了6道题(其实模板题以前应该打过一部分但懒得找)(不过感觉我模板还是不够溜要找个时间刷一发). 没注明模板题的都是傻逼题,其实也是模板题. 题目大致按照傻逼程度从大到小排序. POJ 3264 Balanced Lineup 题意:n个数,m个询问,每次问max[l,r]-min[l,r]. 题解:这道题竟然没标注模板题真是惊讶... #include<cstdio> #inc…
代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=5e5+10; inline int read(){ int x=0,f=1;char ch; do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch)); do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch)); return f*x; } struct node{ int…
Codevs 1036 商务旅行 #include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; ,tot=,last[maxn],dep[maxn],p[maxn][]; struct edge{ int to,pre; }e[maxn<<]; void read(int &k){ k=; ; char c=getchar(); ),c=getchar(); +…
题面 题解 树链剖分 + 主席树 先考虑一个简单一点的问题: [LNOI2014]LCA 我们考察\(dep[\mathrm{LCA}(i, x)]\)的性质,发现它是\(i\)和\(x\)的链交的长度. 那么对每个\(i\)所在的链打一个区间加标记,询问时算一下\(x\)所在的链的区间和即可. 如果有\(l \leq i \leq r\)的限制,就进行离线处理即可. 接下来再考虑一个问题: 给定一棵\(n\)个节点的树,边有边权. 多次询问,每次给定\(x\),求\(\sum_{i = 1}^…
[题意]给定n个点的树,m次求[a,b]和[c,d]中各选出一个点的最大距离.abcd是标号区间,n,m<=10^5 [算法]LCA+树的直径理论+线段树 [题解] 树的直径性质:距离树上任意点最远的点一定是直径的一端.此结论在点集中依然试用. 那么根据性质,容易得到答案路径的两端一定是[a,b]直径的一端和[c,d]直径的一端的连线. (考虑任意一个点集AB的点,在点集A中距离最远的是a或b,在点集B中距离最远的是c或d,故直径的端点只能是abcd) 从而,两个区间的直径可以快速合并成一个区间…
[题意]给定n个点的树,每个点属于一个分类,求每个分类中(至少有2个点)最远的两点距离.n<=200000 [算法]LCA [题解]结论:树上任意点集中最远的两点一定包含点集中深度最大的点(求树的直径的结论是该结论的特殊情况) 证明:如果有路径不包含深度最大的点,那么用深度最大的点替换在LCA同一侧的点,答案更优. 做法就是一遍dfs求出各分类深度最大的点,然后枚举试图更新答案. 复杂度O(n log n) #include<cstdio> #include<cstring>…