洛谷P4211 LCA
题意:多次询问,每次求点的标号在[l, r]之间的所有点到点z的lca的深度。
解:看到这题有没有想到某一道很熟悉的题?紫妹和幽香是17岁的少女,喜欢可爱的东西......
显然这就是开店的超级无敌弱化版......直接套用做法就行了。
记得对"爱你一生一世"取模。(滑稽)
#include <cstdio>
#include <algorithm> typedef long long LL;
const int N = , M = ; struct Edge {
int nex, v;
}edge[N]; int tp; int e[N], top[N], num, fa[N], siz[N], son[N], d[N], n, pos[N];
LL sum[M];
int rt[N], tot, ls[M], rs[M], tag[M]; inline void adde(int x, int y) {
tp++;
edge[tp].v = y;
edge[tp].nex = e[x];
e[x] = tp;
return;
} void DFS1(int x) { // get siz fa son d
siz[x] = ;
d[x] = d[fa[x]] + ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
fa[y] = x;
DFS1(y);
siz[x] += siz[y];
if(siz[y] > siz[son[x]]) {
son[x] = y;
}
}
return;
} void DFS2(int x, int f) { // get pos id top
top[x] = f;
pos[x] = ++num;
if(son[x]) {
DFS2(son[x], f);
}
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(y == son[x]) {
continue;
}
DFS2(y, y);
}
return;
} void add(int x, int &y, int L, int R, int l, int r) {
if(!y || x == y) {
y = ++tot;
sum[y] = sum[x];
tag[y] = tag[x];
ls[y] = ls[x];
rs[y] = rs[x];
}
sum[y] += std::min(R, r) - std::max(L, l) + ;
if(L <= l && r <= R) {
tag[y]++;
return;
}
int mid = (l + r) >> ;
if(L <= mid) {
add(ls[x], ls[y], L, R, l, mid);
}
if(mid < R) {
add(rs[x], rs[y], L, R, mid + , r);
}
return;
} LL ask(int x, int y, int L, int R, int l, int r, int vx, int vy) {
if(L <= l && r <= R) {
return sum[y] - sum[x] + 1ll * (vy - vx) * (r - l + );
}
vx += tag[x];
vy += tag[y];
int mid = (l + r) >> ;
LL ans = ;
if(L <= mid) {
ans += ask(ls[x], ls[y], L, R, l, mid, vx, vy);
}
if(mid < R) {
ans += ask(rs[x], rs[y], L, R, mid + , r, vx, vy);
}
return ans;
} inline void add(int x, int time) {
while(x) {
add(rt[time - ], rt[time], pos[top[x]], pos[x], , n);
x = fa[top[x]];
}
return;
} inline LL ask(int x, int y, int z) {
LL ans = ;
while(z) {
ans += ask(rt[x - ], rt[y], pos[top[z]], pos[z], , n, , );
z = fa[top[z]];
}
return ans;
} int main() {
int q;
scanf("%d%d", &n, &q);
for(int i = , x; i <= n; i++) {
scanf("%d", &x);
adde(x + , i);
}
DFS1();
DFS2(, );
for(int i = ; i <= n; i++) {
add(i, i);
}
for(int i = , x, y, z; i <= q; i++) {
scanf("%d%d%d", &x, &y, &z);
LL t = ask(x + , y + , z + );
printf("%lld\n", t % );
}
return ;
}
AC代码
洛谷P4211 LCA的更多相关文章
- 洛谷 SP14932 LCA - Lowest Common Ancestor
洛谷 SP14932 LCA - Lowest Common Ancestor 洛谷评测传送门 题目描述 A tree is an undirected graph in which any two ...
- 洛谷 P4211 [LNOI2014]LCA (树链剖分+离线)
题目:https://www.luogu.org/problemnew/solution/P4211 相当难的一道题,其思想难以用言语表达透彻. 对于每个查询,区间[L,R]中的每个点与z的lca肯定 ...
- 洛谷 P4211 [LNOI2014]LCA 解题报告
[LNOI2014]LCA 题意 给一个\(n(\le 50000)\)节点的有根树,询问\(l,r,z\),求\(\sum_{l\le i\le r}dep[lca(i,z)]\) 一直想启发式合并 ...
- 【洛谷 P4211】[LNOI2014]LCA(树链剖分,差分)
题目链接 看到题目肯定首先想到要求LCA(其实是我菜),可乍一看,n与q的规模为5W, 求LCA的复杂度为\(O(logN)\),那么总时间复杂度为\(O(nq\ log\ n)\). 怎么搞呢? 会 ...
- 洛谷$P4211\ [LNOI2014]\ LCA$ 树链剖分+线段树
正解:树剖+线段树 解题报告: 传送门$QwQ$ 看到$dep[lca]$啥的就想到之前托腮腮$CSP$模拟$D1T3$的那个套路,,, 然后试下这个想法,于是$dep[lca(x,y)]=\sum_ ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- 洛谷P3703 [SDOI2017]树点涂色(LCT,dfn序,线段树,倍增LCA)
洛谷题目传送门 闲话 这是所有LCT题目中的一个异类. 之所以认为是LCT题目,是因为本题思路的瓶颈就在于如何去维护同颜色的点的集合. 只不过做着做着,感觉后来的思路(dfn序,线段树,LCA)似乎要 ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
随机推荐
- 2017-2018-2 20155229《网络对抗技术》Exp1:逆向及Bof基础实践
逆向及Bof基础实践 实践基础知识 管道命令: 能够将一个命令的执行结果经过筛选,只保留需要的信息. cut:选取指定列. 按指定字符分隔:只显示第n 列的数据 cut -d '分隔符' -f n 选 ...
- 20155333 《网络对抗》 Exp5 MSF基础应用
20155333 <网络对抗> Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:攻击手段,是能使攻击武器(payl ...
- Eclipse中Maven插件配置
1. Maven插件配置 http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 2. Ma ...
- 06-Git-Linux命令
Git 命令 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一.新建代码库 # 新建一个目录,将其初始化为Git代 ...
- 洛咕 P3756 [CQOI2017]老C的方块
四染色,贼好想 一个弃疗图形刚好对应一个红-绿-黄-粉色路线(不要吐槽颜色) 就是裸的最小割,建图傻逼懒得写了 #include<bits/stdc++.h> #define il inl ...
- apache目录别名
#默认家目录DocumentRoot "/var/www/html"<Directory "/var/www"> AllowOverride Non ...
- 用C++实现一个Brainfuck解释器
Brainfuck是一种极小化的计算机语言,只含有8种运算符,由于fuck在英语中是脏话,这种语言有时被称为brainfck或brainf**,甚至被简称为BF.正如它的名字所暗示,brainfuck ...
- phabricator 结合 arcanist 使用
简介 arcanist 是 phabricator 接口的命令工具,主要用于提交 diff 和 push review 通过的commit. 安装 下载源码,然后指定系统的环境变量即可 $ some_ ...
- 如何使用淘宝 NPM 镜像,安装CNPM的方法
npm 版本需要大于 3.0 前提:安装好npm 环境:Linux 直接在linux下输入命令: npm install -g cnpm --registry=https://registry.npm ...
- Anibei前端基础学习
html.html5.CSS2.CSS3.JQuery.Vue.js学习,后端程序媛开始学习前端开发啦.