[填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分。其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过。
我们先来把树上差分能做到的看一下:
1.找所有路径公共覆盖的边
例题:[NOIP2015]运输计划 (然而我还没过就先不讲了)
反正就是中间有一步要求一条边被所有计划公共覆盖。
那么怎么求它呢?暴力(滚粗)。我们有一个非常好的方法就是树上差分(记录tmp为差分数组)
询问操作为从叶子节点的权值向上累加到root
在一条路径u→ v,如果tmp[u]++,那么我们往上推的时候相当于u到root所有路径都被访问一次。同理tmp[v]++也意味如此。但是,lca(u,v)到root的路径都没有被访问过,但这里都被标记过两次,所以我们还要做的操作就是tmp[lca(u,v)]-=2;这样的话累加完之后tmp[i]记录的就是i节点被多少条路径覆盖了。
2.将路径上的所有点权值+1,最后求点权
例题:[JLOI2014]松鼠的新家 (这个我做过了hhh)
题目大意就是给你一些路径,把这个路径经过的点权+1,最后求所有点权。
这个题今天卡了我了。同学大佬有拿树剖求的,而且还要差分。但是我对于树上差分有点蒙蔽,于是搜了搜。然而蒟蒻的我搜到了LCA解法,于是兴高采烈的打(chao)了(le)出来。这里的差分有一些不同。因为我们要找的是点的覆盖。所以我们对于u→ v,tmp[u]++,tmp[v]++,tmp[lca(u,v)]--,tmp[fa[lca(u,v)]]--;这个想必大家能看懂吧。
于是,我们就欢快的求出了所有点被修改后的权值。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> #include<cmath> #define pos(i,a,b) for(int i=(a);i<=(b);i++) using namespace std; #define N 301000 struct haha{ int next,to; }edge[N*2]; int head[N],cnt=1,p[N][20]; void add(int u,int v){ edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++; } int a[N],n,fa[N],dep[N]; void dfs(int x){ for(int i=head[x];i;i=edge[i].next){ int to=edge[i].to; if(fa[x]!=to){ fa[to]=x;dep[to]=dep[x]+1; dfs(to); } } } void init(){ int j; for(j=0;(1<<j)<=n;j++){ pos(i,1,n) p[i][j]=-1; } pos(i,1,n){ p[i][0]=fa[i]; } for(j=1;(1<<j)<=n;j++){ pos(i,1,n){ if(p[i][j-1]!=-1){ p[i][j]=p[p[i][j-1]][j-1]; } } } } int lca(int a,int b){ int i; if(dep[a]<dep[b]) swap(a,b); for(i=0;(1<<i)<=dep[a];i++); i--; for(int j=i;j>=0;j--) if(dep[a]-(1<<j)>=dep[b]) a=p[a][j]; if(a==b) return a; for(int j=i;j>=0;j--){ if(p[a][j]!=-1&&p[a][j]!=p[b][j]){ a=p[a][j];b=p[b][j]; } } return fa[a]; } int tmp[N]; void work(int x){ for(int i=head[x];i;i=edge[i].next){ int to=edge[i].to; if(fa[x]!=to){ work(to); tmp[x]+=tmp[to]; } } } int main(){ scanf("%d",&n); pos(i,1,n) scanf("%d",&a[i]); pos(i,1,n-1){ int x,y;scanf("%d%d",&x,&y); add(x,y);add(y,x); } dfs(a[1]); init(); pos(i,1,n-1){ int u=a[i],v=a[i+1]; tmp[u]++;tmp[v]++; tmp[lca(u,v)]--;tmp[fa[lca(u,v)]]--; } work(a[1]); pos(i,2,n) tmp[a[i]]--; pos(i,1,n) printf("%d\n",tmp[i]); return 0; }
[填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)的更多相关文章
- [JLOI2014] 松鼠的新家 (lca/树上差分)
[JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在 ...
- P3258[JLOI2014]松鼠的新家(LCA 树上差分)
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...
- 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家
[题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...
- luoguP3258 [JLOI2014]松鼠的新家 题解(树上差分)
P3258 [JLOI2014]松鼠的新家 题目 树上差分:树上差分总结 #include<iostream> #include<cstdlib> #include<c ...
- [Bzoj3631][JLOI2014]松鼠的新家 (树上前缀和)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2350 Solved: 1212[Submit][Sta ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...
- P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
随机推荐
- Flex Robotlegs
Flex Robotlegs 一.基于Robotlegs框架 flex应用基本组成 ProjectNameContext.as 用于配置 Robotlegs 的映射 ProjectName.mxml ...
- Vijos 1011 清帝之惑之顺治 记忆录式的动态规划(记忆化搜索)
背景 顺治帝福临,是清朝入关后的第一位皇帝.他是皇太极的第九子,生于崇德三年(1638)崇德八年八月二ten+six日在沈阳即位,改元顺治,在位18年.卒于顺治十八年(1661),终24岁. 顺治即位 ...
- Django学习(二)---使用模板Templates
学会使用渲染模板的方法来显示html内容. 一.Templates是什么: HTML文件 使用了Django模板语言(Django Tamplate Language DTL) 可以使用第三方模板 二 ...
- vb编程代码大全
数值型函数:abs(num): 返回绝对值sgn(num): num>0 1; num=0 0; num<0 -1;判断数值正负hex(num): 返回十六进制值 直接表示:&Hx ...
- MySQL · 引擎特性 · InnoDB奔溃恢复
前言 数据库系统与文件系统最大的区别在于数据库能保证操作的原子性,一个操作要么不做要么都做,即使在数据库宕机的情况下,也不会出现操作一半的情况,这个就需要数据库的日志和一套完善的奔溃恢复机制来保证.本 ...
- UltraEdit MAC破解方法
在终端输入 printf '\x31\xC0\xFF\xC0\xC3\x90' | dd seek=$((0x92D370)) conv=notrunc bs=1 of=/Applications/U ...
- hibernate3 和hibernate4的一点小变动
这两天在做下学籍管理系统,由于hibernate是之前学的,所以这次开发没意识到hibernate3跟hibernate4版本更换的一些变动. 就照搬之前学hibernate3的代码来用,尽管知道该项 ...
- JS - dateFormat
// date必填, pattern默认'yyyy-MM-dd HH:mm:ss'function dateFormat (date, pattern) { var week = {'0':'日', ...
- 自动化运维—tomcat服务起停(mysql+shell+django+bootstrap+jquery)
项目简介: 项目介绍:自动化运维是未来的趋势,最近学了不少东西,正好通过这个小项目把这些学的东西串起来,练练手. 基础架构: 服务器端:web框架-Django 前端:html css jQuery ...
- hdu_1711: Number Sequence【KMP算法】
题目链接 此次插播点笔记 hdu中点击蓝色的"Compilation Error"可以查看自己是为什么CE的 hdu中提交的话,语言选择G++可以使用<bits/stdc++ ...